2014-09-28 94 views
0

我正在玩弄Tkinter窗口小部件,並試圖將滾動條應用到畫布窗口小部件,但是當程序運行時會掛起 - 沒有錯誤消息等。將滾動條應用到Tkinter中的畫布窗口小部件的問題

首先是附加滾動條的一般邏輯好嗎?

其次,問題似乎與.pack()方法一樣,因爲刪除它可以讓程序運行。正如我已經使用.grid()方法,否則這意味着我必須使用滾動的.grid()方法?如果是的話,如何實現這一目標?任何幫助實現這一目標都將受到極大的重視。預先感謝您的時間。

from tkinter import * 

x = 10 
y = 10 
a = 100 
b = 100 

def change_coord(event): 
     global coord 
     if event.keysym == 'Up': 
      coord[1] -=1 
      coord[3] -=3 
     if event.keysym == 'Down': 
      coord[1] +=1 
      coord[3] +=3 
     if event.keysym == 'Right': 
      coord[0] +=1 
      coord[2] +=3 
     if event.keysym == 'Left': 
      coord[0] -=1 
      coord[2] -=3 
     canvas1.coords(arc, *coord) 


window = Tk() 
window.geometry("500x500") 


#canvas scroll bar 
scrollbar = Scrollbar(window) 
scrollbar.pack(side=RIGHT, fill=Y) 

#canvas and drawing 
canvas1=Canvas(window, yscrollcommand=scrollbar.set, height = 200, width = 400) 
canvas1.grid(row=0, column=0, sticky=W) 
coord = [x, y, a, b] 
arc = canvas1.create_rectangle(*coord, outline="#fb0", fill="#fb0") 

#canvas scrollbar continued 
scrollbar.config(command=canvas1.yview) 

#captureing keyboard inputs and assigning to function 
window.bind_all('<Up>', change_coord) 
window.bind_all('<Down>', change_coord) 
window.bind_all('<Left>', change_coord) 
window.bind_all('<Right>', change_coord) 
window.mainloop() 

另外,我看到,當我使用.pack()方法放置在畫布上的程序運行窗口,滾動條是可見的,但滾動條不實際工作。任何有關這個問題的幫助都會非常受歡迎。謝謝。

+0

爲什麼_are_使用'grid',而不是'pack'爲'canvas1'? – abarnert 2014-09-28 11:02:35

+0

此代碼取自所有添加的小部件已使用網格方法組織的代碼的較大部分。 – sw123456 2014-09-28 11:03:49

+0

從http://effbot.org/tkinterbook/grid.htm:警告:切勿在同一個主窗口中混合網格和包。順便說一句,對我來說,這有些作用(用「包」的畫布)。我有一個滾動條,可以通過單擊上/下框來移動框。然而,酒吧本身則充滿了整個垂直空間。 – Jasper 2014-09-28 12:24:00

回答

2

問題是,您正在將packgrid與兩個共享相同父級的小部件混合在一起。你不能那樣做。您需要爲共享同一父級的所有小部件始終使用一個或另一個。

一旦你解決了這個問題,另一個問題是你沒有定義畫布的哪一部分應該是可見的。您需要配置畫布的scrollregion。大多數情況下,您只需將滾動區域設置爲包含畫布上的所有內容即可。爲了得到一切的邊框在畫布上,你可以使用bbox方法與特殊"all"標籤:

canvas1.configure(scrollregion=canvas1.bbox("all")) 

如果你想在滾動區域比什麼已經繪就更大,指定你想要的任何大小一個元組。您只需指定想要顯示的座標。例如:

canvas1.configure(scrollregion=(0,0,10000,10000) 
+0

這是偉大的布萊恩,謝謝。我添加了您提供的代碼,剩下的唯一問題是隻有在窗口最小化爲小於矩形圖形時,滾動纔會變爲功能。即使將窗簾向下移動超過窗口限制,也不會使滾動功能生效。我究竟做錯了什麼?感謝你的寶貴時間。 – sw123456 2014-09-28 13:02:06

+0

@ sw123456:你沒有做錯任何事。這是預期的行爲。如果您希望滾動條控制更大的區域,請告訴它您要滾動的區域。例如,如果您希望可滾動區域爲10,000像素,請執行'canvas1.configure(scrollregion =(0,0,10000,10000))' – 2014-09-28 13:04:45

+0

此外,如果我在窗口上有更多小部件,並且我無法要使用.grid()方法來排列它們,如果我想要一個可滾動的畫布,組裝這些其他小部件的最佳方法是什麼?.pack()方法似乎不容易組織小部件?謝謝。 – sw123456 2014-09-28 13:06:18

相關問題