2012-06-03 14 views
5

Sono nuovo in questo posto e tkinter. Sono bloccato a creare un listbox o una tela scorrevole. Ho provato entrambi i widget. All'interno di questo listbox o canvas, ho diversi widget per le voci e le etichette. Il punto di origine è R0, C0. Ho usato row/columnconfigure per allungare la listbox o il canvas.listbox scorrevole all'interno di una griglia utilizzando tkinter

Nella finestra principale, avevo 4 pulsanti sulla riga quattro alla colonna quattro (0,4-> 4,4). Ho posizionato la barra di scorrimento sulla colonna 5. Ho tentato di utilizzare il metodo della griglia. Il problema che sto avendo sta rendendo funzionale la barra di scorrimento.

Nota: trasformare il mainframe in una classe è solo uno dei modi in cui ho provato. La confezione della barra di scorrimento sulla destra ha funzionato, con la casella di riepilogo/tela impacchettata a sinistra. Tuttavia, il widget listbox/canvas a cui è indirizzata la barra di scorrimento non scorre la casella di riepilogo/canvas. Inoltre, l'aggiunta di molte caselle di immissione non provoca il scorrimento della casella di riepilogo/tela. Aiuto per favore.

from tkinter import * 
from tkinter.ttk import * 

Style().configure("B.TFrame", relief="flat", 
background="blue") 
Style().configure("R.TFrame", relief="flat", 
background="red") 
Style().configure("R.TLabel", background="red") 

class Application(Frame): 
    def __init__(self, master=None): 
     Frame.__init__(self, master, style="B.TFrame") 
     self.grid(sticky=N+S+E+W) 
     self.mainframe() 

    def mainframe(self): 
     top=self.winfo_toplevel() 
     self.menuBar = Menu(top) 
     top["menu"] = self.menuBar 
     self.subMenu = Menu(self.menuBar, tearoff=0) 
     self.subMenu2 = Menu(self.menuBar, tearoff=0) 
     self.menuBar.add_cascade(label="File", menu=self.subMenu) 
     self.menuBar.add_cascade(label="About", menu=self.subMenu2) 
     self.subMenu.add_command(label="Open") 
     self.subMenu.add_command(label="Save") 
     self.subMenu.add_command(label="Exit") 
     self.subMenu2.add_command(label="About") 
     self.subMenu2.add_command(label="Help") 



     self.data = Listbox (self, bg='red') 
     scrollbar = Scrollbar(self.data, orient=VERTICAL) 

     self.add = Button(self, text="") 
     self.remove = Button(self, text="") 
     self.run = Button(self, text="") 
     self.stop = Button(self, text="") 

     self.data.grid (row=0, column=0, rowspan=4, columnspan=4, sticky=N+E+S+W) 
     self.data.columnconfigure(1, weight=1) 
     self.data.columnconfigure(3, weight=1) 

     self.add.grid(row=4,column=0,sticky=EW)  
     self.remove.grid(row=4,column=1,sticky=EW) 
     self.run.grid(row=4,column=2,sticky=EW) 
     self.stop.grid(row=4,column=3,sticky=EW) 
     scrollbar.grid(column=5, sticky=N+S) 
+0

Si prega di evitare l'uso di caratteri jolly, soprattutto se si pubblica il proprio codice su SO .. – fodma1

risposta

7

senza alcun contenuto nella casella di riepilogo, non c'è niente per scorrere ...

Questo sembra funzionare anche se (accorciato l'esempio un po '). Vedi anche l'esempio allo scrollbar documentation.

class Application(Frame): 
    def __init__(self, master=None): 
     Frame.__init__(self, master)  
     self.grid(sticky=N+S+E+W) 
     self.mainframe() 

    def mainframe(self):     
     self.data = Listbox(self, bg='red') 
     self.scrollbar = Scrollbar(self.data, orient=VERTICAL) 
     self.data.config(yscrollcommand=self.scrollbar.set) 
     self.scrollbar.config(command=self.data.yview) 

     for i in range(1000): 
      self.data.insert(END, str(i)) 

    self.run = Button(self, text="run") 
    self.stop = Button(self, text="stop") 

    self.data.grid(row=0, column=0, rowspan=4, 
        columnspan=2, sticky=N+E+S+W) 
    self.data.columnconfigure(0, weight=1) 

    self.run.grid(row=4,column=0,sticky=EW) 
    self.stop.grid(row=4,column=1,sticky=EW) 

    self.scrollbar.grid(column=2, sticky=N+S) 

a = Application() 
a.mainframe() 
a.mainloop() 
+0

Scusate, sono nuovo qui (ho appena imparato a vedere una risposta .. un anno dopo.). Apprezzo la risposta. Guardo la mia domanda e sono imbarazzato ora. Il problema che ho avuto è stato l'aggiunta di caselle di immissione. Mi sono trasferito, ma quando ho aggiunto 12 caselle di immissione e visualizzato in anteprima il risultato, sullo schermo gli elementi della casella di riepilogo sembravano scorrevoli. Grazie. – Lect

2

È necessario definire l'attributo command per la barra di scorrimento, ed è necessario fornire l'attributo yscrollcommand alla casella di riepilogo. Questi due attributi lavorano insieme per creare qualcosa di scorrevole.

L'opzione yscrollcommand racconta la casella di riepilogo "quando si scorre nella direzione Y, chiamare questo comando. Questo è di solito il metodo di una barra di scorrimento set, in modo che quando l'utente scorre attraverso i tasti freccia, la barra di scorrimento ottiene aggiornati.

L'attributo command di una scorutbar dice "quando l'utente ti sposta, chiama questo comando". Di solito è il metodo yview o xview di un widget, che fa sì che il widget modifichi i suoi parametri di visualizzazione nella direzione Y o X.

Nel tuo caso, dopo aver creato i widget devi fare questo: