为什么Tkinter在打包滚动条时会冻结?

时间:2011-10-24 07:39:28

标签: python tkinter

我正在尝试将滚动条附加到Tkinter中的列表框,但每当代码到达其中一个.pack()行时,它就会冻结......任何想法为什么? (我已尝试运行一个示例代码,该代码与我在互联网上发现的相同,并且工作正常)。

        #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)

好吧这是一个小错误(我混淆了滚动条和滚动条2)。无论如何,现在我有这个代码:

        #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)

这不会冻结,滚动条会出现,但它们没有连接到(或有任何控制权)列表框。关于代码的其余部分,它是所有网格语句,没有包。


我发现了问题,滚动条缺少粘性= 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)

1 个答案:

答案 0 :(得分: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()