【问题标题】:Specify relative width of two embedded "entries" within "text" widget在“文本”小部件中指定两个嵌入“条目”的相对宽度
【发布时间】:2011-12-16 17:50:41
【问题描述】:

我在指定 Linux 和 Windows 上的 Entry 小部件大小时遇到​​问题。这些条目是在 Linux 上创建的:

在 Linux 上,它们在 Text 小部件中看起来不错。有2个Entry单元格,是用这行代码一一创建的:

tk.Entry(master, width=16)

宽度指定为 16 个字符长。

但是,在 Windows 上,单元格只占用一半的空间,我必须指定宽度为 22,因为 Windows 上的字体大小更小。

我的问题是:有没有办法在 Text 小部件中指定这两个单元格的相对宽度,所以每个单元格占用父小部件的 1/2?

【问题讨论】:

    标签: text tkinter width tkinter-entry


    【解决方案1】:

    在文本小部件中?不,没有对相对宽度的直接支持。在一个框架内?是的。如果你把它们放在一个文本小部件中(我想,所以你可以滚动它们)你必须自己管理宽度。您可以将绑定添加到文本小部件的<Configure> 事件。当文本小部件改变大小时触发,您可以在此时调整所有小部件的大小。

    最简单的方法是使用grid 将它们放入框架中,然后将框架放入画布中以便您可以滚动它。

    这是一个例子:

    import Tkinter as tk
    
    class SampleApp(tk.Tk):
        def __init__(self, *args, **kwargs):
            tk.Tk.__init__(self, *args, **kwargs)
            self.canvas = tk.Canvas(self, width=200, highlightthickness=0)
            self.vsb = tk.Scrollbar(orient="vertical", command=self.canvas.yview)
            self.canvas.configure(yscrollcommand=self.vsb.set)
            self.vsb.pack(side="right", fill="y")
            self.canvas.pack(side="left", fill="both", expand=True)
    
            self.container = tk.Frame(self.canvas, borderwidth=0, highlightthickness=0)
            self.container.grid_columnconfigure(0, weight=1)
            self.container.grid_columnconfigure(1, weight=1)
            for i in range(30):
                e1 = tk.Entry(self.container)
                e2 = tk.Entry(self.container)
                e1.grid(row=i, column=0,sticky="ew")
                e2.grid(row=i, column=1,sticky="ew")
                e1.insert(0, "find %s" % i)
                e2.insert(0, "replace %s" % i)
    
            self.canvas.create_window((0,0), anchor="nw", window=self.container, tags="container")
            self.canvas.configure(scrollregion=self.canvas.bbox("all"))
            self.canvas.bind("<Configure>", self.OnCanvasConfigure)
    
        def OnCanvasConfigure(self, event):
            self.canvas.itemconfigure("container", width=event.width)
            self.canvas.configure(scrollregion=self.canvas.bbox("all"))
    
    if __name__ == "__main__":
        app = SampleApp()
        app.mainloop()
    

    【讨论】:

    • 谢谢,Brian - 再次 :) 我真的在为这个小部件苦苦挣扎,但我希望现在已经完成了我需要的功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    • 2012-01-05
    • 2019-04-28
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多