将tkinter ScrolledText添加到网格中

时间:2015-04-21 04:59:09

标签: python tkinter python-3.3

所以,我有一个基本的布局,使用以下代码创建(为简洁起见,这里写):

class ClientUI(tk.Frame):
    def __init(self, master, client, queue, send_command):
        self.master = master
        self.master.grid()
        tk.Grid.rowconfigure(self.master, 0, weight=1)
        tk.Grid.columnconfigure(self.master, 0, weight=1)
        self.create_widgets()

        # This is just to figure out what's going on
        pprint(vars(master))
        self.output_panel = master.children['output']

    def create_widgets(self):
        output = ScrolledText(self.master, name="output", state=tk.DISABLED)
        output.grid(row=0, column=0, sticky=tk.N+tk.S+tk.E+tk.W)

我曾希望将ScrolledText添加到网格中。当我只使用Text小部件时,这确实有效。

但是,我得到KeyError,因为output不在子列表中。以下是pprint语句的输出(再次,剪切以显示相关部分):

'children': {'34864544': <client.clientui.ClientUI object at 0x000000000213FDA0>,
          '46887376': <tkinter.Frame object at 0x0000000002CB71D0>,
          '46890008': <tkinter.Menu object at 0x0000000002CB7C18>,
          'input': <tkinter.Entry object at 0x0000000002CB76A0>}

正如您所看到的,在未显示的代码中添加了一个名为input的子项。但是,似乎没有添加output命名小部件。为什么output.grid(row=0, column=0, sticky=tk.N+tk.S+tk.E+tk.W)没有按预期添加它?

1 个答案:

答案 0 :(得分:0)

似乎创建ScrolledText实际上会创建一个FrameScrolledText小部件与ScrollBar一起包裹,并将name分配给ScrolledText未分配给Frame,而是分配给ScrolledText

因此,master.children确实不包含名称为'output'的孩子,而是Frame。然后可以在'output'的子项中找到Frame窗口小部件。

>>> pprint(master.children)
{'140447721418704': <tkinter.Frame object at 0x7fbc888b6fd0>}
>>> pprint([c.children for c in master.children.values()])
[{'140447721417696': <tkinter.Scrollbar object at 0x7fbc888b6be0>,
  'output': <tkinter.scrolledtext.ScrolledText object at 0x7fbc888b6f98>}]

因此,如果您希望获得对ScrolledText小部件的引用,则必须从Frame获取,但是当将其绑定到self时可能要容易得多。你创造它,即

self.output = ScrolledText(self.master, name="output")

这确实与你从Frame的孩子那里得到的对象相同:

self.output_panel = next(c.children["output"] for c in master.children.values() if "output" in c.children)
print(repr(self.output_panel))
print(self.output_panel is self.output)

输出:

<tkinter.scrolledtext.ScrolledText object at 0x7f3e02bf6f98>
True