2012-06-03 21 views
5

Ich bin neu in diesem Ort und tkinter. Ich bin dabei, eine scrollbare Listbox oder Leinwand zu erstellen. Ich habe beide Widgets ausprobiert. Innerhalb dieser Listbox oder Canvas habe ich mehrere Eingabe- und Label-Widgets. Der Ursprungspunkt ist R0, C0. Ich habe row/columnconfigure verwendet, um die Listbox oder Canvas zu dehnen.scrollbare Listbox in einem Raster mit tkinter

Im Hauptfenster hatte ich 4 Tasten in Reihe vier bis Spalte vier (0,4-> 4,4). Ich habe die Bildlaufleiste in Spalte 5 platziert. Ich habe versucht, die Rastermethode zu verwenden. Das Problem, das ich habe, macht die Bildlaufleiste funktional.

Hinweis: Das Drehen des Mainframes in eine Klasse ist nur eine der Möglichkeiten, die ich versucht habe. Es hat funktioniert, die Scrollleiste rechts zu packen, mit der Listbox/Canvas auf der linken Seite. Das Listbox-/Canvas-Widget, zu dem die Bildlaufleiste befohlen wurde, scrollt jedoch nicht in der Listbox/Leinwand. Auch das Hinzufügen vieler Eingabefelder führt nicht zum Scrollen des Listenfelds/Arbeitsbereichs. Hilfe bitte.

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

Bitte vermeiden Sie die Verwendung von Wildcard-Import, vor allem, wenn Sie Ihren Code auf SO .. – fodma1

Antwort

7

ohne Inhalt in der Listbox, gibt es nichts zu blättern ...

Dies scheint allerdings zu arbeiten (das Beispiel ein wenig verkürzt). Siehe auch das Beispiel unter der 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

Entschuldigung, ich bin neu hier (gerade gelernt, wie eine Antwort zu sehen .. ein Jahr später.). Ich schätze die Antwort. Ich schaue auf meine Frage und es ist mir jetzt peinlich. Das Problem, das ich hatte, war das Hinzufügen von Eingabefeldern. Ich habe weitergemacht, aber als ich über 12 Eingabefelder hinzugefügt und das Ergebnis in der Vorschau angezeigt habe, waren die Listenfelder auf dem Bildschirm scrollbar. Vielen Dank. – Lect

2

Sie müssen das command Attribut auf die Scrollbar definieren, und Sie müssen das yscrollcommand Attribut in das Listenfeld liefern. Diese beiden Attribute arbeiten zusammen, um etwas scrollbar zu machen.

Die yscrollcommand Option teilt dem Listenfeld „, wenn Sie in der Y-Richtung gescrollt werden, diesen Befehl aufrufen. Dies ist in der Regel die set Methode eines Scrollbar, so dass, wenn der Benutzer einen Bildlauf über Pfeiltasten, wird der Scrollbar aktualisiert.

das command Attribut eines scorllbar sagt „wenn der Benutzer, der Sie bewegt, rufen Sie diesen Befehl.“ Dies ist in der Regel die yview oder xview Methode eines Widgets, die das Widget verursacht seine Ansicht Parameter in der Y- oder X-Richtung zu ändern.

In Ihrem Fall, nach dem Erstellen der Widgets würden Sie dies tun: