将 tkinter ScrolledText 添加到网格
Adding tkinter ScrolledText to a grid
所以,我有一个使用以下代码创建的基本布局(为简洁起见写在这里):
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)
没有按预期添加?
看起来创建一个 ScrolledText
实际上创建了一个 Frame
将实际的 ScrolledText
小部件与 ScrollBar
和您分配的 name
包装在一起to ScrolledText
不是分配给 Frame
,而是分配给包装的 ScrolledText
.
因此,master.children
确实不包含名称为 'output'
的 child,而是 Frame
。然后可以在 Frame
的 children 中找到 'output'
小部件。
>>> 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
中获取 if,但将其绑定到 [=29= 可能会容易得多] 当你创建它时,即
self.output = ScrolledText(self.master, name="output")
这确实 object 与您从 Frame
的 children:
得到的相同
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
所以,我有一个使用以下代码创建的基本布局(为简洁起见写在这里):
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)
没有按预期添加?
看起来创建一个 ScrolledText
实际上创建了一个 Frame
将实际的 ScrolledText
小部件与 ScrollBar
和您分配的 name
包装在一起to ScrolledText
不是分配给 Frame
,而是分配给包装的 ScrolledText
.
因此,master.children
确实不包含名称为 'output'
的 child,而是 Frame
。然后可以在 Frame
的 children 中找到 'output'
小部件。
>>> 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
中获取 if,但将其绑定到 [=29= 可能会容易得多] 当你创建它时,即
self.output = ScrolledText(self.master, name="output")
这确实 object 与您从 Frame
的 children:
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