2017-05-02 11 views
0

Ich bin neu in Tkinter und Python3. Ich habe daran gearbeitet, eine Bildlaufleiste für einen Frame zu erstellen, der ein untergeordnetes Element eines Canvas ist, das auch ein Kind von Toplevel() ist. Die Scrollbar-Tasten funktionieren gut, aber die Bar/Box selbst erstreckt sich von oben nach unten und kann sich nicht bewegen. Außerdem kann der Benutzer mit den Scroll-Tasten weit über den Inhalt hinaus blättern (wo nichts zu sehen ist). Hier ist der Code.So passen Sie die Bildlaufleiste an?

#! /usr/bin/env python3 

from tkinter import * 
from filegroups import typeGroups 

app = Tk() 

types_window = Toplevel(app) 
types_window.wm_title('Types') 

yscrollbar = Scrollbar(types_window, orient=VERTICAL) 
yscrollbar.grid(row=0, column=1, sticky=N+S) 

canvas = Canvas(types_window, 
       width = 300, 
       height = 500, 
       yscrollcommand=yscrollbar.set) 

canvas.grid(row=0,column=0) 
canvas.config(scrollregion=canvas.bbox("all")) 
yscrollbar.config(command=canvas.yview) 

frame = Frame(canvas) 

canvas.create_window(0,0,anchor=NW,window=frame) 

for key in sorted(typeGroups.keys()): 
    options_frame = LabelFrame(frame, text=key) 
    options_frame.grid(padx=5, pady=10) 
    for item in typeGroups[key]: 
     item_button = Checkbutton(options_frame, 
            text=item) 
     item_button.grid() 

app.mainloop() 

Antwort

0

Sie müssen durch das Hinzufügen dieser beiden Linien kurz vor app.mainloop() die Leinwand scrollregion nach dem Füllen der Rahmen mit Etiketten aktualisieren:

canvas.update_idletasks() 
canvas.config(scrollregion=canvas.bbox("all")) 

Der Aufruf update_idletasks ist notwendig, um sicherzustellen, dass die Leinwand Inhalt aktualisiert wird bevor wir nach der Bounding Box fragen.

Verwandte Themen