2012-11-28 39 views
1

使用python 3.2.2 tkinter我創建了一個畫布,畫布上連接了滾動條,但畫布中的數據當我移動滾動條時不滾動。 tkinter的語法問題或錯誤?使用python 3.2.2 tkinter我創建了一個畫布,並附帶了滾動條,但當我移動滾動條時,畫布內的數據不會滾動

示例代碼:

from tkinter import * 

## GUI color map ### 
black = "#000000" 

root = Tk() 
root.minsize(100,100) 
root.maxsize(500,500) 
root.resizable(0,0) 

topFrame = Frame(root, bd=2, relief=SUNKEN) 
topFrame.pack() 

xscrollbar = Scrollbar(topFrame, orient=HORIZONTAL) 
xscrollbar.pack(side=BOTTOM, fill=X) 

yscrollbar = Scrollbar(topFrame, orient=VERTICAL) 
yscrollbar.pack(side=RIGHT, fill=Y) 

conFrame = Canvas(topFrame, bd=0, scrollregion=(0, 0, 1000, 1000), 
       xscrollcommand=xscrollbar.set, 
       yscrollcommand=yscrollbar.set) 

conFrame.pack(side=TOP, fill=BOTH, expand=1) 
xscrollbar.config(command=conFrame.xview) 
yscrollbar.config(command=conFrame.yview) 

for i in range(1,30): 
    function_name = 'my'+str(i)+'ItemList = StringVar()' 
    exec(function_name) 
    function_name = 'my'+str(i)+'Item = '+str(i) 
    exec(function_name) 
    function_name = 'my'+str(i)+'ItemList.set(my'+str(i)+'Item)' 
    exec(function_name) 
    function_name = 'my'+str(i)+'ItemListEntry = Entry(conFrame, width=148,  foreground=black, textvariable=my'+str(i)+'ItemList)' 
    exec(function_name) 
    function_name = 'my'+str(i)+'ItemListEntry.pack(side=TOP, padx=2)' 
    exec(function_name) 

mainloop() 

回答

1

滾動條滾動畫布。您正在創建的小部件(在高度不尋常的時尚)不是畫布的一部分,所以他們不滾動。如果您在畫布上使用繪圖命令,則會看到畫布項目實際上進行了滾動。

爲了讓小部件滾動,您必須將它們嵌入到畫布中,並使用create_window。如果您嘗試創建滾動框架,則典型的解決方案是將所有小部件放在一個框架中,使用create_window將該框架添加到畫布,然後將scrollregion設置爲框架的大小(您必須執行的操作在屏幕更新之後,因爲大小沒有被計算,直到小部件被實際呈現)

在旁註中,爲什麼使用exec?它使你的代碼非常難以理解,並且你無法獲得任何回報。你知道你可以用更簡單的東西代替這10行嗎?例如:

var = {} 
for i in range(1,30): 
    var[i] = StringVar() 
    var[i].set(i) 
    e = Entry(conFrame, width=148, foreground=black, textvariable=var[i]) 
    e.pack(side=TOP, padx=2) 
+0

由於一噸的幫助。我肯定錯過了create_window。我已經與創建窗口一起實現了迭代代碼,現在我有一個工作滾動框架。 –

0

工作的代碼示例:

from tkinter import * 

## GUI color map ### 
black = "#000000" 

root = Tk() 
root.title("Canvas Scrollbar Example") 
root.minsize(100,100) 
root.maxsize(500,500) 
root.resizable(0,0) 

topFrame = Frame(root, bd=2, relief=SUNKEN) 
topFrame.pack() 

xscrollbar = Scrollbar(topFrame, orient=HORIZONTAL) 
xscrollbar.pack(side=BOTTOM, fill=X) 

yscrollbar = Scrollbar(topFrame, orient=VERTICAL) 
yscrollbar.pack(side=RIGHT, fill=Y) 

canvasFrame = Canvas(topFrame, width=500, height=500, scrollregion=(0, 0, 1000, 1000), 
       xscrollcommand=xscrollbar.set, 
       yscrollcommand=yscrollbar.set) 

canvasFrame.pack(side=TOP, fill=BOTH, expand=1) 

xscrollbar.config(command=canvasFrame.xview) 
yscrollbar.config(command=canvasFrame.yview) 

entryFrame = Frame(canvasFrame, bd=2, relief=SUNKEN) 
entryFrame.pack() 

var = {} 
for i in range(1,30): 
    var[i] = StringVar() 
    var[i].set(i) 
    e = Entry(entryFrame, width=148, foreground=black, textvariable=var[i]) 
    e.pack(side=TOP, padx=2) 

canvasFrame.create_window(0, 0, window=entryFrame, anchor='nw') 

mainloop()