Укажите относительную ширину двух встроенных «записей» в виджете «текст»

#text #tkinter #width #tkinter-entry

#текст #tkinter #ширина #tkinter-запись

Вопрос:

У меня возникла проблема с указанием размера виджета ввода в Linux и Windows. Эти записи были созданы в Linux:

В Linux они отлично смотрятся в текстовом виджете. Есть 2 ячейки ввода одна за другой, созданные с помощью этой строки кода:

tk.Entry(master, width=16)

Ширина указана как длина 16 символов.

Однако в Windows ячейки занимают только половину пространства, и я должен указать ширину 22, потому что размер шрифта в Windows меньше.

Мой вопрос: есть ли способ указать относительную ширину этих двух ячеек в текстовом виджете, чтобы каждая ячейка занимала 1/2 родительского виджета?

Ответ №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()
 

Комментарии:

1. Спасибо, Брайан — еще раз 🙂 Я действительно боролся с этим виджетом, но я надеюсь, что теперь он подходит для того, что мне нужно.