2013-02-19 3 views
2

Я создал два виджета текстового поля бок о бок. Левое поле «Текст» содержит 100 строк ящиков Checkbutton. Правильное текстовое поле содержит 100 строк текста. Я настроил оба текстовых поля на одну и ту же высоту 30 и ширину 10.Tkinter: Работа с Checkbutton + панель прокрутки внутри текстового виджета

Когда я запускаю программу, левое текстовое поле растет вертикально за пределы области экрана, доступной для просмотра. В результате правильное текстовое поле сдвигается так далеко по кадру, что я больше не могу его видеть. Я знаю, что он есть, потому что, когда я уменьшаю количество строк (для обоих ящиков) до 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

Мне нужно было использовать метод виджета Text, называемый 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 не соблюдается, но должно быть связано с этим grid 'ing CheckBox.

Эта же проблема затрагивает ScrollBar, она прикреплена слева Frame, а не Text; Я не пробовал, но, возможно, создание его после создания Text, которое вы хотите прикрепить к нему, может быть полезно.

Ваш другой вопрос о том, что он не синхронизирован, может быть вопросом установки weight, как this, но это не сработало для меня. Причина, по которой я думаю, может заключаться в том, что они не являются частью одной и той же сетки, поскольку они не могут сообщать свой размер друг другу. Оба из Frames имеют тот же размер, который лучше всего может сделать, я думаю.

Уже поздно, и я, вероятно, ошибаюсь в этом, поэтому, пожалуйста, возьмите это с солью.

Некоторые элементы отладки, которые мне нравятся, если .config(bg="RED") виджетов, связанных с моей проблемой, и иногда это поможет мне визуализировать именно то, что происходит.

+0

Благодарим вас за предложения.После долгих проб и ошибок я обнаружил, что решение заключается в использовании метода window_create текстового виджета для встраивания объектов (например, моего объекта checkbutton). –

+0

@ DirtyPenguin О, аккуратно, рад, что ты разобрался. Извините, я больше не мог вам помочь. – TankorSmash

+0

Не беспокойтесь. Ваше предложение изменить цвет фона очень полезно для отладки. Я запомню, что он движется вперед. Еще раз спасибо. –

Смежные вопросы