У меня есть OptionMenu и кнопка в соседних строках одного и того же столбца сетки. Я не хочу, чтобы сетка управляла размером этих виджетов, потому что она может сделать виджеты слишком широкими. Вместо этого я бы хотел, чтобы OptionMenu и Button имели фиксированный размер — максимальную ширину Button, ширину OptionMenu и ширину всех пунктов меню. Но у меня с этим проблемы.
Ширина и высота OptionMenu и Button изначально равны 1, поэтому сначала я должен связать , чтобы позволить геометрии сетки Менеджер сообщит мне желаемые размеры. Чтобы предотвратить бесконечный цикл, я немедленно отвязываю событие в обработчике.
Затем я могу вычислить ширину всех виджетов либо в пикселях, либо в текстовых единицах. Если я устанавливаю максимальную ширину в обработчике, я обнаруживаю, что «дескриптор» OptionMenu добавляет немного ширины, поэтому ширины кнопок и OptionMenu не совпадают.
Это вынуждает меня вкладывать друг в друга виджеты OptionMenu и Button внутри собственных фреймов (которые, в свою очередь, находятся внутри сетки). Затем я упаковываю OptionMenu и Button для расширения, но отключаю распространение пакетов в кадре. Идея состоит в том, чтобы установить ширину рамки и заставить вложенные виджеты расширяться до заполнения.
К сожалению, менеджер геометрии сетки сообщает моему обработчику, что OptionMenu и Button теперь запрашивают пространство размером 1x1 пиксель. , поскольку распространение пакета отключено. Если я включу пакетное распространение, изменю размер фреймов, а затем отключу пакетное распространение, это будет как если бы пакетное распространение всегда было отключено.
Далее я начал с нуля. Там, где будут OptionMenu и Button, я поместил фрейм с размахом строк, равным 2; Содержимое фрейма также управляется (вложенным) менеджером геометрии сетки. Рамка липкая="w"; он уменьшится, чтобы соответствовать своему содержимому. Содержимое липкое="ew"; они будут заполняться до одинакового размера.
Это работает хорошо, за исключением того, что там, где текст в столбцах одной строки будет иметь общую базовую линию, менеджер геометрии вложенной сетки не разделяет базовые линии с родительским менеджер геометрии сетки. Например, текст метки в первом столбце больше не имеет общей базовой линии с текстом OptionMenu во втором столбце. Вместо этого базовая линия текста метки в первом столбце теперь выровнена по нижней части OptionMenu.
Как это исправить?
Для Например, здесь я переместил метку «Ячейка (0,0)» во внутреннюю сетку. Это позволяет мне выровнять текст, но я теряю возможность центрировать вложенные столбцы внутри внешних столбцов.
#!/usr/bin/env python3
import tkinter as tk
import tkinter.font
import tkinter.scrolledtext
import PIL.Image
import PIL.ImageTk
class App:
options = ["short", "really really really really long"]
unselected = ""
def __init__(self, parent, **kwargs):
title = parent.winfo_toplevel().title()
font = tk.font.Font(family="Arial", size=12, weight="bold")
# Create a frame for the entire window
frame = tk.Frame(parent, **kwargs)
frame.pack(fill=tk.BOTH, expand=True)
# Set the title label from the window title
title_label = tk.Label(frame, text=title, font=font)
title_label.grid(row=0, columnspan=2, padx=10, pady=10)
# Load the logos
logo1_image = PIL.Image.new("RGB", (200,200), (0,255,0))
logo2_image = PIL.Image.new("RGB", (200,200), (255,0,0))
logo1_label = tk.Label(frame, borderwidth=0)
logo2_label = tk.Label(frame, borderwidth=0)
# TODO:
# I'm seeing slow-motion resize on large resizes. I believe that
# multiple resizes are being queued, but I can't cancel that queue. I
# need to make this callback schedule a cancellable callback that then
# resizes.
logo1_label.bind\
( ""
, lambda e, i=logo1_image, w=logo1_label: self.resizeimage(e, i, w)
)
logo2_label.bind\
( ""
, lambda e, i=logo2_image, w=logo2_label: self.resizeimage(e, i, w)
)
logo1_label.grid(row=1, column=0, padx=10, pady=10, sticky="nsew")
logo2_label.grid(row=1, column=1, padx=10, pady=10, sticky="nsew")
# Create a frame for interactive elements
#input_frame = tk.Frame(frame)
input_frame = tk.Frame(frame, bg="red")
input_frame.grid(row=2, columnspan=2)
input_frame.grid_columnconfigure(0, weight=1, uniform="column")
input_frame.grid_columnconfigure(1, weight=1, uniform="column")
# Label for cell (0,0)
c00_label = tk.Label\
(input_frame, font=font, text="cell (0,0)")
c00_label.grid(row=0, column=0, padx=10, pady=10, sticky="ew")
# Create the OptionMenu
options_var = tk.StringVar()
options_var.set(self.unselected)
options = tk.OptionMenu(input_frame, options_var, *self.options)
options.configure(font=font)
options["menu"].configure(font=font)
options.grid(row=0, column=1, padx=10, pady=10, sticky="ew")
# Create the Button
button = tk.Button\
( input_frame
, font=font, text="implement option"
)
button.grid(row=1, column=1, padx=10, pady=(0,0), sticky="ew")
# Create the labels for the 3rd row
c30_label = tk.Label\
(frame, font=font, text="cell (3,0)")
c30_label.grid(row=3, column=0, padx=10, pady=10, sticky="ew")
c31_label = tk.Label\
(frame, font=font, text="cell (3,1)")
c31_label.grid(row=3, column=1, padx=10, pady=10, sticky="ew")
text = tk.scrolledtext.ScrolledText\
(frame, state=tk.DISABLED, font=font)
text.grid(row=4, columnspan=2, padx=10, pady=10, sticky="nsew")
frame.grid_columnconfigure(0, weight=1, minsize=100)
frame.grid_columnconfigure(1, weight=1, minsize=100)
frame.grid_rowconfigure(0, weight=0)
frame.grid_rowconfigure(1, weight=1, minsize=100)
frame.grid_rowconfigure(2, weight=0)
frame.grid_rowconfigure(3, weight=0)
frame.grid_rowconfigure(4, weight=4)
@staticmethod
def resizeimage(event, image, widget):
image = image.copy()
image.thumbnail\
( (event.width, event.height)
, resample=PIL.Image.Resampling.BILINEAR
, reducing_gap=None
)
image = PIL.ImageTk.PhotoImage(image)
widget.config(image=image)
# Images are not referenced by tkinter
widget.image = image
#widget.unbind("")
def main():
root = tk.Tk()
root.title("Helpful Title")
app = App(root)
root.mainloop()
if __name__ == "__main__":
main()
Подробнее здесь: https://stackoverflow.com/questions/790 ... tton-width
Соответствие OptionMenu и ширины кнопки ⇐ Python
Программы на Python
1727456989
Anonymous
У меня есть OptionMenu и кнопка в соседних строках одного и того же столбца сетки. Я не хочу, чтобы сетка управляла размером этих виджетов, потому что она может сделать виджеты слишком широкими. Вместо этого я бы хотел, чтобы OptionMenu и Button имели фиксированный размер — максимальную ширину Button, ширину OptionMenu и ширину всех пунктов меню. Но у меня с этим проблемы.
Ширина и высота OptionMenu и Button изначально равны 1, поэтому сначала я должен связать , чтобы позволить геометрии сетки Менеджер сообщит мне желаемые размеры. Чтобы предотвратить бесконечный цикл, я немедленно отвязываю событие в обработчике.
Затем я могу вычислить ширину всех виджетов либо в пикселях, либо в текстовых единицах. Если я устанавливаю максимальную ширину в обработчике, я обнаруживаю, что «дескриптор» OptionMenu добавляет немного ширины, поэтому ширины кнопок и OptionMenu не совпадают.
Это вынуждает меня вкладывать друг в друга виджеты OptionMenu и Button внутри собственных фреймов (которые, в свою очередь, находятся внутри сетки). Затем я упаковываю OptionMenu и Button для расширения, но отключаю распространение пакетов в кадре. Идея состоит в том, чтобы установить ширину рамки и заставить вложенные виджеты расширяться до заполнения.
К сожалению, менеджер геометрии сетки сообщает моему обработчику, что OptionMenu и Button теперь запрашивают пространство размером 1x1 пиксель. , поскольку распространение пакета отключено. Если я включу пакетное распространение, изменю размер фреймов, а затем отключу пакетное распространение, это будет как если бы пакетное распространение всегда было отключено.
Далее я начал с нуля. Там, где будут OptionMenu и Button, я поместил фрейм с размахом строк, равным 2; Содержимое фрейма также управляется (вложенным) менеджером геометрии сетки. Рамка липкая="w"; он уменьшится, чтобы соответствовать своему содержимому. Содержимое липкое="ew"; они будут заполняться до одинакового размера.
Это работает хорошо, за исключением того, что там, где текст в столбцах одной строки будет иметь общую базовую линию, менеджер геометрии вложенной сетки не разделяет базовые линии с родительским менеджер геометрии сетки. Например, текст метки в первом столбце больше не имеет общей базовой линии с текстом OptionMenu во втором столбце. Вместо этого базовая линия текста метки в первом столбце теперь выровнена по нижней части OptionMenu.
Как это исправить?
Для Например, здесь я переместил метку «Ячейка (0,0)» во внутреннюю сетку. Это позволяет мне выровнять текст, но я теряю возможность центрировать вложенные столбцы внутри внешних столбцов.
#!/usr/bin/env python3
import tkinter as tk
import tkinter.font
import tkinter.scrolledtext
import PIL.Image
import PIL.ImageTk
class App:
options = ["short", "really really really really long"]
unselected = ""
def __init__(self, parent, **kwargs):
title = parent.winfo_toplevel().title()
font = tk.font.Font(family="Arial", size=12, weight="bold")
# Create a frame for the entire window
frame = tk.Frame(parent, **kwargs)
frame.pack(fill=tk.BOTH, expand=True)
# Set the title label from the window title
title_label = tk.Label(frame, text=title, font=font)
title_label.grid(row=0, columnspan=2, padx=10, pady=10)
# Load the logos
logo1_image = PIL.Image.new("RGB", (200,200), (0,255,0))
logo2_image = PIL.Image.new("RGB", (200,200), (255,0,0))
logo1_label = tk.Label(frame, borderwidth=0)
logo2_label = tk.Label(frame, borderwidth=0)
# TODO:
# I'm seeing slow-motion resize on large resizes. I believe that
# multiple resizes are being queued, but I can't cancel that queue. I
# need to make this callback schedule a cancellable callback that then
# resizes.
logo1_label.bind\
( ""
, lambda e, i=logo1_image, w=logo1_label: self.resizeimage(e, i, w)
)
logo2_label.bind\
( ""
, lambda e, i=logo2_image, w=logo2_label: self.resizeimage(e, i, w)
)
logo1_label.grid(row=1, column=0, padx=10, pady=10, sticky="nsew")
logo2_label.grid(row=1, column=1, padx=10, pady=10, sticky="nsew")
# Create a frame for interactive elements
#input_frame = tk.Frame(frame)
input_frame = tk.Frame(frame, bg="red")
input_frame.grid(row=2, columnspan=2)
input_frame.grid_columnconfigure(0, weight=1, uniform="column")
input_frame.grid_columnconfigure(1, weight=1, uniform="column")
# Label for cell (0,0)
c00_label = tk.Label\
(input_frame, font=font, text="cell (0,0)")
c00_label.grid(row=0, column=0, padx=10, pady=10, sticky="ew")
# Create the OptionMenu
options_var = tk.StringVar()
options_var.set(self.unselected)
options = tk.OptionMenu(input_frame, options_var, *self.options)
options.configure(font=font)
options["menu"].configure(font=font)
options.grid(row=0, column=1, padx=10, pady=10, sticky="ew")
# Create the Button
button = tk.Button\
( input_frame
, font=font, text="implement option"
)
button.grid(row=1, column=1, padx=10, pady=(0,0), sticky="ew")
# Create the labels for the 3rd row
c30_label = tk.Label\
(frame, font=font, text="cell (3,0)")
c30_label.grid(row=3, column=0, padx=10, pady=10, sticky="ew")
c31_label = tk.Label\
(frame, font=font, text="cell (3,1)")
c31_label.grid(row=3, column=1, padx=10, pady=10, sticky="ew")
text = tk.scrolledtext.ScrolledText\
(frame, state=tk.DISABLED, font=font)
text.grid(row=4, columnspan=2, padx=10, pady=10, sticky="nsew")
frame.grid_columnconfigure(0, weight=1, minsize=100)
frame.grid_columnconfigure(1, weight=1, minsize=100)
frame.grid_rowconfigure(0, weight=0)
frame.grid_rowconfigure(1, weight=1, minsize=100)
frame.grid_rowconfigure(2, weight=0)
frame.grid_rowconfigure(3, weight=0)
frame.grid_rowconfigure(4, weight=4)
@staticmethod
def resizeimage(event, image, widget):
image = image.copy()
image.thumbnail\
( (event.width, event.height)
, resample=PIL.Image.Resampling.BILINEAR
, reducing_gap=None
)
image = PIL.ImageTk.PhotoImage(image)
widget.config(image=image)
# Images are not referenced by tkinter
widget.image = image
#widget.unbind("")
def main():
root = tk.Tk()
root.title("Helpful Title")
app = App(root)
root.mainloop()
if __name__ == "__main__":
main()
Подробнее здесь: [url]https://stackoverflow.com/questions/79031934/match-optionmenu-and-button-width[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия