2017-12-19 5 views
0

Dies funktioniert gut, wenn die Listbox Root ist, aber wenn ich es in ein Toplevel-Fenster verschieben, wird die Bildlaufleiste nicht mehr angezeigt.Lose yScroll beim Verschieben von Listbox Klasse zu Toplevel von ROOT - in Tkinter

Hier ist der spezifische Code (Beachten Sie die aassign Abfrage wurde nicht angewandt) I

class App: 

def __init__(self): 

    self.listb=Toplevel() 
    self.listb.transient(root) 
    self.listb.title=('DB View') 
    self.vsb = Scrollbar(orient="vertical", command=self.OnVsb) 
    self.listNum = Listbox(self.listb, yscrollcommand=self.vsb.set) 
    self.listRoster = Listbox(self.listb, yscrollcommand=self.vsb.set) 
    self.vsb.pack(side="right",fill="y") 
    self.listNum.pack(side="left",fill="x", expand=True) 
    self.listRoster.pack(side="left",fill="x", expand=True) 
    self.listNum.bind("<MouseWheel>", self.OnMouseWheel) 
    self.listRoster.bind("<MouseWheel>", self.OnMouseWheel) 
    dbi = mdb.connect("localhost", port=3306, user="user", passwd="access", db="interactive_db") 
    cursor = dbi.cursor() 
    cursor.execute("""SELECT num FROM active_roster""") 
    rows = cursor.fetchall() 
    cursor.execute("""SELECT firstname, surname, assign FROM active_roster""") 
    staff =cursor.fetchall() 
    cursor.execute("""SELECT assign FROM active_assign""") 
    aassign = cursor.fetchall() 
    dbi.close() 
    print(rows) 
    print(aassign) 
    print (staff) 

    for results in rows: 
     self.listNum.insert("end", results) 
    for results2 in staff: 
      self.listRoster.insert("end", results2) 
    self.listb.mainloop() 

def OnVsb(self, *args): 
    self.listNum.yview(*args) 
    self.listRoster.yview(*args) 

def OnMouseWheel(self, event): 
    self.listNum.yview("scroll", event.delta,"units") 
    self.listRoster.yview("scroll",event.delta,"units") 

    return "break" 



root = Tk() 
root.title("Main") 

root.geometry("900x600") 


app=App() 
listb = MultipleScrollingListbox() 

#PRE-DUAL COLUMN SYNTAX PRE-CLASS DEF 

numLabel=Label(root, text="Num #") 
numLabel.grid(row=0,column=0) 

assLabel=Label(root, text="Assignment") 
assLabel.grid(row=0,column=2) 


num_input=StringVar() 
num_input=Entry(root,textvariable=num_input) 
num_input.grid(row=0,column=1) 

ass_input=StringVar() 
ass_input=Entry(root,textvariable=ass_input) 
ass_input.grid(row=0,column=3) 


rosterList=Listbox(root, height=6,width=65) 
rosterList.grid(row=2, column=0, rowspan=9, columnspan=4) 
rosterList.bind('<<ListboxSelect>>', on_selection) 

commScroll=Scrollbar(root) 
commScroll.grid(row=2, column=4, rowspan=9) 

rosterList.configure(yscrollcommand=commScroll.set) 
commScroll.configure(command=rosterList.yview) 


root.mainloop() 

ich meine ursprüngliche Original-Syntax enthalten, bevor ich brauchte mit der Hoffnung auf einen mehrspaltigen Layout bewegen das gleiche Aussehen der Aufrechterhaltung begann zu migrieren in die Klasse def - Dinge begannen neu zu schief gehen ...

Ich bin neu in Tkinter und brauche eine Richtung hier als die OnVsb Definition scheint zu vermasseln.

LISTBOX IMAGE

+0

Bitte versuchen Sie [ein minimales, vollständiges und überprüfbares Beispiel zu erstellen] (https://stackoverflow.com/help/mcve). Wir können Ihren Code nicht so ausführen, wie er ist, und selbst wenn wir es waren, enthält er redundante Teile, die das Debugging erschweren. Wir können den Fehler nicht reproduzieren. – Nae

+0

Wenn Sie sicher sind, dass Ihre Einrückung genau so ist wie die, die Sie hier haben, dann müssen Sie alle 'def's und was darin ist, einmal eingerückt haben. – Nae

+0

Kein Problem wird Anzeige aktualisieren – Raymond

Antwort

2

Sie benötigen das Master-Widget in dem Scrollbar Aufruf enthalten:

self.vsb = Scrollbar(self.listb, orient="vertical", command=self.OnVsb) 

Andernfalls wird standardmäßig die erste Wurzel, die, warum es vor funktioniert.

+0

Nicht überrascht, dass Sie es gelöst haben - Ihre Skriptprobe, der ich folgte - THX. Ich habe es in einem Hauptfenster als vorübergehendes Fenster geöffnet. – Raymond

Verwandte Themen