2013-02-19 48 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