Tkinter:在Text小部件中使用Checkbutton + Scrollbar

时间:2013-02-19 04:22:52

标签: python tkinter

我已经并排创建了两个文本框小部件。左侧的文本框包含100行Checkbutton框。右侧文本框包含100行文本。我已将两个文本框配置为具有相同的高度30和宽度10。

当我运行程序时,左侧文本框垂直增长超出我的可视屏幕区域的大小。结果,右侧文本框被推到框架下方,我无法再看到它。我知道它在那里,因为当我将行数(对于两个盒子)减少到50(而不是100)时,我可以看到正确的文本框。

另外,我注意到左侧滚动条未连接到左侧文本框。但是,右侧滚动条正确连接到右侧文本框。

能帮助我理解:

1)为什么左侧文本框垂直增长(在定义的文本小部件大小之外)并且与右侧文本框大小和位置不同步?

2)为什么左侧滚动条不会附加到左侧文本小部件(如右侧文本框)?

到目前为止,这是我的代码:

#!/usr/bin/python
from Tkinter import *

class MyApp:
    def __init__(self, parent):
       self.myParent = parent
       self.main_container = Frame(self.myParent)
       self.main_container.grid(row=0, column=0, columnspan=4)

       self.left_frame = Frame(self.main_container)
       self.left_frame.grid(row=0, column=0, columnspan=2)

       self.right_frame = Frame(self.main_container)
       self.right_frame.grid(row=0, column=2, columnspan=2)

       self.checkbox_scrollbar = Scrollbar(self.left_frame)
       self.checkbox_scrollbar.grid(row=0, column=1, sticky='NS')
       self.checkbox_text = Text(self.left_frame, height=30, width=10, yscrollcommand=self.checkbox_scrollbar.set)
       self.checkbox_text.grid(row=0, column=0)
       self.checkbox_scrollbar.config(command=self.checkbox_text.yview)

       self.databox_scrollbar = Scrollbar(self.right_frame)
       self.databox_scrollbar.grid(row=0, column=1, sticky='NS')
       self.databox_text = Text(self.right_frame, height=30, width=10, yscrollcommand=self.databox_scrollbar.set)
       self.databox_text.grid(row=0, column=0)
       self.databox_scrollbar.config(command=self.databox_text.yview)

    my_dict = {}
    for each_num in range(100):
        my_line = "Line number: " + str(each_num)
        my_dict[my_line] = 0

    for my_key in my_dict:
        my_dict[my_key] = IntVar()
        cb = Checkbutton(self.checkbox_text, text=my_key, variable=my_dict[my_key])
        cb.grid(sticky='W')

    for each_entry in range(100):
        entry_line = "This is entry number: " + str(each_entry) + "\n"
        self.databox_text.insert(END, entry_line)


root = Tk()
root.title("Checkbox UI Test")
myapp = MyApp(root)
root.mainloop()

2 个答案:

答案 0 :(得分:1)

我已经在这一个小时了,但我的Tkinter知识并不像我想的那么完整,所以我相信其他人会得到另一个答案,但是:

实际上并没有显示Text框,据我所知,它被后来的CheckBox隐藏了。尝试checkbox_text.insert(END, "some text")并将背景更改为"red",即使您将100个复选框更改为仅绘制2,您也会看到它在屏幕上不可见。我不知道为什么高度限制为Text未被尊重,但grid的{​​{1}}必须与之相关。

同样的问题正在影响CheckBox,它附加到左ScrollBar,而不是Frame;我没有尝试过,但是在您创建要附加它的Text之后创建它可能会有所帮助。

关于它不同步的另一个问题可能是设置Text,如this,但它对我不起作用。我认为可能的原因是它们不属于同一个网格,因为它们无法将它们的大小相互通信。我认为weight都是相同的大小,这是它能做的最好的。

现在已经很晚了,我对这里的东西可能不对,所以请把这一切都拿出来。

如果小部件上的Frames与我的问题有关,我喜欢做一些调试工作,有时这会帮助我直观地了解正在发生的事情。

答案 1 :(得分:1)

我需要使用名为window_create的Text小部件方法来插入我的嵌入式对象(我的checkbutton小部件)。以下是如何实现它。希望这有助于其他人:

for my_key in my_dict:
    my_dict[my_key] = IntVar()
    cb = Checkbutton(text=my_key, variable=my_dict[my_key])
    self.checkbox_text.window_create("END", window=cb)
    self.checkbox_text.insert("END", "\n")