2011-10-24 51 views
2

我試圖將一個滾動條附加到Tkinter的列表框中,但是隻要代碼到達.pack()行之一,它就會凍結......任何想法爲什麼? (我嘗試過運行一個示例代碼,它的功能與我在互聯網上找到的相同,並且工作正常)。爲什麼在包裝滾動條時Tkinter會凍結?

 #Read Box 
    self.scrollbar = Tkinter.Scrollbar(self.frame) 
    #self.scrollbar.pack(side=Tkinter.RIGHT, fill=Tkinter.Y) 
    self.read = Tkinter.Listbox(self.frame, width=50, yscrollcommand=self.scrollbar.set) 
    self.read.grid(row=1,column=2) 
    #self.read.pack(side=Tkinter.LEFT, fill=Tkinter.BOTH) 
    self.scrollbar.config(command=self.read.yview) 

任何想法爲什麼這段代碼不起作用?


更新代碼:

 #Read Box 
    self.scrollbar = Tkinter.Scrollbar(self.frame) 
    self.scrollbar2.grid(sticky=Tkinter.N+Tkinter.S) #row=1, column=2 side=Tkinter.RIGHT, fill=Tkinter.Y 

    self.read = Tkinter.Listbox(self.frame, width=50, yscrollcommand=self.scrollbar.set) 
    self.read.grid(row=1,column=2) #side=Tkinter.LEFT, fill=Tkinter.BOTH 

    self.scrollbar.config(command=self.read.yview) 

好吧,這是一個小的失誤(我困惑滾動條和scrollbar2)。反正現在我有這樣的代碼:

 #Read Box 
    self.scrollbar = Tkinter.Scrollbar(self.frame) 
    self.scrollbar.grid(row=1, column=2) 

    self.read = Tkinter.Listbox(self.frame, width=50, yscrollcommand=self.scrollbar.set) 
    self.read.grid(row=1,column=2) 

    self.scrollbar.config(command=self.read.yview) 

這不凍結,並出現滾動條,但它們沒有連接(或者有任何控制權)的列表框。關於其餘的代碼,這是所有的網格語句,沒有包。


我發現問題,滾動條丟失sticky = Tkinter.N + Tkinter.S。這是完成的代碼(添加了水平條)。

 #Read Box 
    self.scrollbar = Tkinter.Scrollbar(self.frame) 
    self.scrollbar.grid(row=1, column=3, sticky=Tkinter.N+Tkinter.S) 

    self.hbar = Tkinter.Scrollbar(self.frame, orient=Tkinter.HORIZONTAL) 
    self.hbar.grid(row=2, column=2, sticky=Tkinter.E+Tkinter.W) 

    self.read = Tkinter.Listbox(self.frame, width=50, yscrollcommand=self.scrollbar.set, xscrollcommand=self.hbar.set) 
    self.read.grid(row=1,column=2) 

    self.scrollbar.config(command=self.read.yview) 
    self.hbar.config(command=self.read.xview) 
+0

您的代碼示例未提供足夠的信息。如果代碼凍結,它通常意味着兩件事之一:您創建了自己的無限循環(或長時間運行)循環,或者將網格和包裝混合在同一個容器中。只用您發佈的一小部分代碼來分辨您的問題是不可能的。 –

+0

如果你的代碼不再被凍結,那麼你的問題已經找到了答案!所以,如果我的回答是正確的,請接受它。現在關於滾動條:也許你應該使用'self.mainloop()'命令? –

+0

您的回答已被接受。我已經調用了一個主循環(),但是? – user573949

回答

2

似乎你在同級別混合packgrid(即內部沒有兩個獨立的Frame否則)。這將使您的應用程序凍結,如文檔中所述。

所以,你應該做的是.grid你的滾動條:-)

更多材料:如上面所說的,你可以混合使用不同的窗口管理器,但不是同一個框架內。以下內容是合法的,並且將起作用:

from Tkinter import * 
root = Tk() 
f1 = Frame(root) 
f1.pack() 
Label(f1, text='some text').grid(row=0, column=0) 
Button(f1, text='Button').grid(row=1, column=0) 

f2 = Frame(root) 
f2.pack() 
Label(f2, text="content of Frame 2").pack() 

root.mainloop() 
+0

我改變了代碼,所以它沒有框架的包裝聲明,我使用了網格,但它仍然無法工作?我用這個替換了包: self.scrollbar2.grid(row = 1,column = 2,side = Tkinter.RIGHT,fill = Tkinter.Y) – user573949

+0

嗯,我不知道現在不在工作,但是我打賭你會得到一些錯誤,比如'grid未知參數:-side'。 'grid'沒有使用與'pack'相同的參數;相當於'fill = Tkinter.Y'將會是'sticky = N + S'。你可以試試看,併發布你的更新代碼? –

+0

'self.scrollbar2.grid(sticky = Tkinter.N + Tkinter.S)'和'self.scrollbar2.grid(row = 1 column = 2)'會導致Tkinter凍結,如果我全部更改它們以包裝,Tkinter不凍結,但我無法控制小工具的位置。 – user573949

相關問題