【问题标题】:Tkinter: Working with Checkbutton + Scrollbar inside a Text widgetTkinter:在 Text 小部件中使用 Checkbutton + Scrollbar
【发布时间】:2013-02-03 16:20:03
【问题描述】:

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

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

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

请您帮我理解一下:

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

2) 为什么左侧的 Scrollbar 不附加到左侧的 Text 小部件(如右侧的 Text 框)?

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

#!/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()

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

    我已经过了一个小时,但我的 Tkinter 知识并不像我想要的那样完整,所以我相信其他人会给出另一个答案,但是:

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

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

    您关于它不同步的另一个问题可能是设置weight,例如this,但它对我不起作用。我认为这可能是因为它们不属于同一个网格,因为它们无法相互交流它们的大小。 Frames 的大小相同,我认为这是最好的。

    已经很晚了,我可能对这里的东西有误,所以请对这一切持保留态度。

    如果.config(bg="RED") 对与我的问题相关的小部件,我喜欢做一些调试工作,有时这将帮助我准确地了解正在发生的事情。

    【讨论】:

    • 感谢您的建议。经过多次尝试和错误,我发现解决方案是使用 Text 小部件的 window_create 方法嵌入对象(例如我的 checkbutton 对象)。
    • @DirtyPenguin 哦,太好了,很高兴你被整理出来了。抱歉,我无法为您提供更多帮助。
    • 不用担心。您更改背景颜色的建议对调试非常有用。我会记住它继续前进。再次感谢。
    【解决方案2】:

    我需要使用名为 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")
    

    【讨论】:

      猜你喜欢
      • 2017-07-19
      • 2011-03-30
      • 2018-11-23
      • 2011-10-20
      • 2019-09-16
      • 2017-10-13
      • 1970-01-01
      • 1970-01-01
      • 2016-12-09
      相关资源
      最近更新 更多