从教程中,我有点认为网格只是“有点想象”的宽度,但是当涉及到文本时(我想与列表结合时)显然不是这样。
使用以下代码,列表框很小,文本绝对是大量的(宽度方面)。我可以通过改变sticky =“ew”使列表框等于文本的大小,但这不是我想要的 - 我想要一个合理的,等效的样式“网格”。
如果我硬编码宽度的大小,则更令人沮丧,因为列表框宽度似乎等于文本宽度的大约2/3。
我已经阅读了rowconfigure和columnconfiugre,但这似乎与下面的代码实际上没有任何关系(注意 - rowconfigure和columnconfigure不在下面的代码中,但我已经尝试过了,也许我使用它们错了)。
无论如何,使用下面的代码 - 任何人都可以向我解释如何使这些更合理的宽度更明智,同样如此?我应该将宽度硬编码为Text,然后将listbox设置为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的宽度完全不同(甚至更多,当我指定一个宽度)。
答案 0 :(得分:2)
tkinter如何计算尺寸tkinter.ListBox()和tkinter.Text()窗口小部件与使用像素的大多数其他窗口小部件略有不同。对于这两个特定小部件,宽度是根据字符计算的,而高度是根据线条来评估的。
您没有设置self.lst_bx
的宽度,因此tkinter默认将其设置为20个字符。
您也没有指定self.exe_field
的宽度。因此tkinter根据当前的默认字体大小计算此宽度。
从1)和2)我们可以得出结论,我们不能指望self.exe_field
具有与self.lst_bx
相同的宽度是很正常的。这意味着,除了硬编码之外别无选择,并可视化检查GUI。
对您的代码进行细微更改(主要在您的问题下面的评论中提供),这就是我解决您问题的方法:
import tkinter as tk
class MainApplication(tk.Frame):
def __init__(self, parent, *args, **kwargs):
tk.Frame.__init__(self, parent, *args, **kwargs)
self.parent = parent
self.initialize()
def initialize(self):
self.lst_bx = tk.Listbox(self, height = 15, width=70)
self.lst_bx.grid(row=0, column=0, padx=(10,10), sticky="w")
self.exe_field = tk.Text(self, height=15, width=80)
self.exe_field.grid(row=1, column=0, padx=(10,10), sticky="w")
self.pick_exe_btn = tk.Button(self, text="Choose Location", width=15)
self.pick_exe_btn.grid(row=0, column=2, columnspan=2)
if __name__ == "__main__":
root = tk.Tk()
#window_config(root)
MainApplication(root).grid(stick="nesw")
root.resizable(False, False)
root.mainloop()
请注意我移动columnspace
选项的位置(它在您之前设置它的两个地方完全没有感觉)。另请注意,tkinter在列表框和文本小部件之间以不同的方式计算字符。根据您的操作系统(也可能是机器),您可能需要更改我在问题中设置为小部件的2个宽度尺寸。
以下是我在我的机器上的内容: