【发布时间】:2018-04-28 05:53:00
【问题描述】:
从教程中,我有一种印象,即网格只是“计算出来”的宽度,但对于文本显然不是这种情况(我想与列表结合使用时)。
使用以下代码,列表框很小,而文本绝对很大(宽度方面)。我可以通过更改sticky="ew" 使列表框等于文本的大小,但这不是我想要的——我想要一个合理的、等效样式的“网格”。
如果我硬编码宽度的大小,那就更令人沮丧了,因为列表框的宽度似乎等于文本宽度的大约 2/3。
我已经阅读了 rowconfigure 和 columnconfigure,但这似乎对下面的代码没有任何作用(注意 - rowconfigure 和 columnconfigure 不在下面的代码中,但我已经尝试过了,也许我用错了)。
无论如何,使用下面的代码 - 任何人都可以向我解释如何使这些尺寸更合理,宽度也一样吗?我是否应该将宽度硬编码为 Text,然后将列表框设置为 Sticky="ew"?似乎与网格布局概念背道而驰。
class MainApplication(tk.Frame):
def __init__(self, parent, *args, **kwargs):
self.frame = tk.Frame.__init__(self, parent, *args, **kwargs)
self.parent = parent
self.initialize()
def initialize(self):
self.lst_bx = tk.Listbox(self.parent, height = 15)
self.lst_bx.grid(row=0, column=0, columnspan=2, padx=(10,10), sticky="w")
self.exe_field = tk.Text(self.parent, height=15)
self.exe_field.grid(row=1, column=0, columnspan=2, padx=(10,10), sticky="w")
self.pick_exe_btn = tk.Button(
self.parent, text="Choose Location", width=15
)
self.pick_exe_btn.grid(row=0, column=2)
if __name__ == "__main__":
root = tk.Tk()
#window_config(root)
MainApplication(root).grid(stick="nesw")
root.resizable(False, False)
root.mainloop()
我很抱歉我是个菜鸟,我发誓我在这里发帖之前已经搜索了很多 - 我只是找不到关于为什么 ListBox 与 Text 的宽度完全不同的直接答案(当我指定一个时更是如此宽度)。
【问题讨论】:
-
为了获得一个合理的、等效样式的“网格”,创建框架并将小部件放在框架内。正确使用
rowspan、columnspan和`粘性参数。这需要一些时间,复杂性取决于您尝试实现的 UI 类型。 -
@Abhijeetk431 你有如何做到这一点的例子吗?
-
顺便说一句:首先:
__init__总是返回None,所以分配给 self.frame 是没有意义的——你可以使用self来访问这个框架。第二:self.parent保留root,因此您将小部件直接放在root中,而不是在框架MainApplication中。使用self将小部件放入框架MainApplication。第三:Listbox和Text可以使用不同的字体,tkinter 使用width=和字体大小计算实际宽度。 -
我认为你想要的不清楚,文本小部件似乎是默认大小。如果你想减小它的宽度,那么配置
width? -
也许提供一张您希望 GUI 看起来像的图像。
标签: python python-3.x tkinter listbox