2013-02-19 148 views
2

我已经并排创建了两个文本框小部件。左边的文本框包含100行Checkbutton框。正确的文本框包含100行文本。我已经将两个文本框的高度设置为30,宽度为10.Tkinter:使用Checkbutton + Textbar内的滚动条小工具

当我运行该程序时,左侧的文本框垂直增长超出了我的可视屏幕区域的大小。结果,正确的文本框被推到框架的尽头,我再也看不到它了。我知道它在那里,因为当我将行数(对于两个框)减少到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() 

回答

1

我需要使用文本控件的window_create方法插入我的嵌入对象(我的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") 
1

我已经在这一个小时,但我Tkinter的知识的并不完整,因为我想,所以我敢肯定,别人会来与另一个答案,但:

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

同样的问题影响到ScrollBar,它附在左边Frame,而不是Text;我还没有尝试过,但是在创建Text之后,可能会创建它,以便将其附加到可能有用的地方。

关于它不同步的其他问题可能是设置weight,如this,但它不适用于我。我认为这可能是因为他们不是同一个网格的一部分,因为他们无法将它们的大小传达给对方。我认为Frames都是相同的尺寸,这是最好的。

它已经很晚了,我可能在这里的东西错了,所以请把这一切都用一粒盐。

一些调试的东西,我喜欢做,如果.config(bg="RED")对小部件有关我的问题,有时这将帮助我可视化到底发生了什么。

+0

谢谢您的建议。经过多次试验和错误之后,我发现解决方案是使用Text小部件的window_create方法来嵌入对象(比如我的checkbutton对象)。 – 2013-02-20 03:53:28

+0

@DirtyPenguin哦整齐,很高兴你整理出来。抱歉,我无法帮助你。 – TankorSmash 2013-02-20 03:55:05

+0

不用担心。您的建议更改背景颜色对调试非常有用。我会记住它向前发展。再次感谢。 – 2013-02-20 04:00:56

相关问题