Соответствие OptionMenu и ширины кнопкиPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Соответствие OptionMenu и ширины кнопки

Сообщение 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()


Подробнее здесь: https://stackoverflow.com/questions/790 ... tton-width
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Соответствие OptionMenu и ширины кнопки
    Anonymous » » в форуме Python
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • Соответствие OptionMenu и ширины кнопки
    Anonymous » » в форуме Python
    0 Ответы
    23 Просмотры
    Последнее сообщение Anonymous
  • Соответствие OptionMenu и ширины кнопки
    Anonymous » » в форуме Python
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous
  • Соответствие ширины OptionMenu и Button (и изображений с изменяемым размером в расширяемых контейнерах)
    Anonymous » » в форуме Python
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous
  • Сделать все кнопки одинаковой ширины, когда кнопки сложены для мобильных устройств и когда кнопки вложены на два уровня
    Anonymous » » в форуме Html
    0 Ответы
    63 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»