2017-02-14 28 views
1

Я нашел несколько вопросов и ответов, связанных с этим, но ни одно из решений не дают мне понять, почему этот код не работает:Tkinter Canvas & Scrollbar

root=tk.Tk() 

vscrollbar = tk.Scrollbar(root) 

c= tk.Canvas(root,background = "#D2D2D2",yscrollcommand=vscrollbar.set) 

vscrollbar.config(command=c.yview) 
vscrollbar.pack(side=tk.LEFT, fill=tk.Y) 

f=tk.Frame(c) #Create the frame which will hold the widgets 

c.pack(side="left", fill="both", expand=True) 
c.create_window(0,0,window=f) 

testcontentA = tk.Label(f,wraplength=350 ,text=r"Det er en kendsgerning, at man bliver distraheret af læsbart indhold på en side, når man betragter dens websider, som stadig er på udviklingsstadiet. Der har været et utal af websider, som stadig er på udviklingsstadiet. Der har været et utal af variationer, som er opstået enten på grund af fejl og andre gange med vilje (som blandt andet et resultat af humor).") 
testcontentB = tk.Button(f,text="anytext") 
testcontentA.pack() 
testcontentB.pack() 

f.pack() 

c.config(scrollregion=c.bbox("all")) 

root.mainloop() 

У меня есть окно Tkinter, которая динамически генерируемый контент - что означает необходимость прокрутки вниз, если на экране отображается два виджета. Я надеюсь, что вы сможете заполнить фрейм 'f' виджетами, а затем использовать функцию canvas.create_window(), чтобы отобразить ее прокручиваемым способом.

Прямо сейчас отображается окно, но полоса прокрутки не включена - это похоже на область прокрутки, неверно, или связь между полосой прокрутки и холстом неверна.

ответ

1

Если вы вставляете рамку в холст, вы должны использовать create_window, а не pack. Первый шаг - удалить f.pack().

Во-вторых, вам необходимо установить bbox после. Tkinter имеет возможность отображать виджеты, так как их размер не может быть вычислен до тех пор, пока они не будут нарисованы на экране.

Простой способ выполнить это, чтобы позвонить root.update() перед вызовом c.config(scrollregion=c.bbox("all")) или планировать эту команду для запуска с after_idle.

Другая ошибка в коде (я предполагаю, что ...) является то, что вы создаете окно в точке (0,0), но не устанавливать якорь. Это означает, что внутренний фрейм будет центрироваться на (0,0), когда я предполагаю, что верхний левый угол будет равен (0,0).

Изменить create_window вызов выглядеть следующим образом:

c.create_window(0,0,window=f, anchor='nw') 
+0

Это замечательно - спасибо большое! Я проверю это и вернусь – user3535074

0
import tkinter as tk 

root=tk.Tk() 

vscrollbar = tk.Scrollbar(root) 

c= tk.Canvas(root,background = "#D2D2D2",yscrollcommand=vscrollbar.set) 

vscrollbar.config(command=c.yview) 
vscrollbar.pack(side=tk.LEFT, fill=tk.Y) 

f=tk.Frame(c) #Create the frame which will hold the widgets 

c.pack(side="left", fill="both", expand=True) 

#Updated the window creation 
c.create_window(0,0,window=f, anchor='nw') 

#Added more content here to activate the scroll 
for i in range(100): 
    tk.Label(f,wraplength=350 ,text=r"Det er en kendsgerning, at man bliver distraheret af læsbart indhold på en side, når man betragter dens websider, som stadig er på udviklingsstadiet. Der har været et utal af websider, som stadig er på udviklingsstadiet. Der har været et utal af variationer, som er opstået enten på grund af fejl og andre gange med vilje (som blandt andet et resultat af humor).").pack() 
    tk.Button(f,text="anytext").pack() 

#Removed the frame packing 
#f.pack() 

#Updated the screen before calculating the scrollregion 
root.update() 
c.config(scrollregion=c.bbox("all")) 

root.mainloop() 

Благодаря Bryan Oakley за большой ответ.

0

Это легко, вы храните c.create в кортеже!

from tkinter import * 
root = Tk() 
c = Canvas(root, width=500, height=400).pack() 
scroll = c.create_rectangle(225,175,175,225,fill='black'),c.create_rectangle(225,175,275,225) 
while True: 
     x1 = 1 
     c.move(scroll,x1,0) 
canvas.mainloop()