tkinter: поиск необязательных аргументов виджета

#python #tkinter

#python #tkinter

Вопрос:

Итак, я создал виджет label и дал ему аргументы ключевого слова ‘width’ и ‘text’. Я хочу получить значения, установленные для этих аргументов, используя кнопку с командой ‘find_text’, которая затем выводит эти значения на экран. Можете ли вы объяснить, почему winfo_width() не возвращает то же значение, которое я установил для ключевого слова width метки? Является ли значение шириной пикселей? В любом случае, как мне получить значение, которое я присвоил (50)? Также как мне получить текст, который я присвоил этой метке? Конечно, метод, который я использовал, не существует, но он предназначен для демонстрации, чтобы показать, что я хочу.

 from tkinter import *

def find_text():
    widthlabel = Label(root, text=label.winfo_width())
    widthlabel.pack()
    textlabel = Label(root, text=label.winfo_text())
    textlabel.pack()

root = Tk()
root.geometry("500x500")
root.configure(bg="black")

label = Label(root, width=50, text="hello")
label.pack()

button = Button(root, text="find_text_button", command=find_text)
button.pack()

root.mainloop()
  

Ответ №1:

Я бы сделал это 2 способами.

  • Используя cget() метод:
 def find_text():
    widthlabel = Label(root, text=label.cget('width')) #get the value of option width
    widthlabel.pack()
    textlabel = Label(root, text=label.cget('text')) #get the value of option text
    textlabel.pack()
  
  • Следующий шаг — это простое индексирование свойств, например:
 def find_text():
    widthlabel = Label(root, text=label['width']) #returns the width value given
    widthlabel.pack()
    textlabel = Label(root, text=label['text']) #returns the text value given
    textlabel.pack()
  

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

1. Именно то, что мне было нужно. Большое спасибо!

Ответ №2:

Можете ли вы объяснить, почему winfo_width() не возвращает то же значение, которое я установил для ключевого слова width метки?

winfo_width() возвращает фактическую ширину. Фактическая ширина зависит от того, видна она или нет, а также от параметров диспетчера геометрии (например: диспетчер геометрии может уменьшать или увеличивать ее по сравнению с заданным размером). Если у tkinter не было возможности обновить отображение или вы не добавили виджет на дисплей, фактическая ширина будет равна нулю.

Короче говоря, фактическая ширина не обязательно соответствует заданной ширине.

Если вам нужно настроенное событие, вы используете cget , например label.cget("width") .