Tkinter文本小部件比任何其他带网格的小部件都要宽

时间:2017-11-15 05:34:06

标签: python python-3.x tkinter listbox

从教程中,我有点认为网格只是“有点想象”的宽度,但是当涉及到文本时(我想与列表结合时)显然不是这样。

使用以下代码,列表框很小,文本绝对是大量的(宽度方面)。我可以通过改变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的宽度完全不同(甚至更多,当我指定一个宽度)。

1 个答案:

答案 0 :(得分:2)

tkinter如何计算尺寸tkinter.ListBox()和tkinter.Text()窗口小部件与使用像素的大多数其他窗口小部件略有不同。对于这两个特定小部件,宽度是根据字符计算的,而高度是根据线条来评估的。

  1. 您没有设置self.lst_bx的宽度,因此tkinter默认将其设置为20个字符。

  2. 您也没有指定self.exe_field的宽度。因此tkinter根据当前的默认字体大小计算此宽度。

  3. 从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个宽度尺寸。

    以下是我在我的机器上的内容:

    enter image description here