#python-3.x #tkinter
#python-3.x #tkinter
Вопрос:
Мне нужна помощь в понимании того, как работает Tk inter.Я использую первый пример со страницы документов, который создает простое окно с 2 кнопками. Введение в программирование GUI с помощью tkinter
Код:
from tkinter import Tk, Label, Button
class MyFirstGUI:
def __init__(self, master):
self.master = master
master.title("A simple GUI")
self.label = Label(master, text="This is our first GUI!")
self.label.pack()
self.greet_button = Button(master, text="Greet", command=self.greet)
self.greet_button.pack()
self.close_button = Button(master, text="Close", command=master.quit)
self.close_button.pack()
def greet(self):
print("Greetings!")
root = Tk()
my_gui = MyFirstGUI(root)
root.mainloop()
Вопросы:
- MyFirstGUI не наследуется от TK или Frame, так откуда же он знает обо всех параметрах (self.label,self.greet и т.д.) Можно найти в классе Tk
- Мы передаем объект TK переменной root ( root = Tk()) и передаем его в класс MyFirstGUI (my_gui = MyFirst GUI(root) ) .Тогда единственным правдоподобным объяснением является это self.label и self.greet_button изначально являются «действительно» переменными класса и «становятся» ярлыками (и кнопками), как только они связаны с такими функциями, как Label(master, text =»Это наш первый графический интерфейс!»)
правильно ли я понимаю?
бехрам
Ответ №1:
Итак, tkinter — это просто библиотека с классами внутри нее, в этом коде вы импортируете класс TK, класс Label и класс Button. Когда вы используете инструкции import в верхней части вашего кода, вы говорите компьютеру, чтобы он извлек эти файлы / функции и прочитал их в программу. Например, если класс TK, скажем, состоит из 100 строк кода, инструкция from tkinter import TK
эквивалентна тем 100 строкам кода, которые находятся перед тем, что вы написали.
Теперь, переходя к созданию самого пользовательского интерфейса, вы создаете экземпляр класса TK и присваиваете его переменной root. Этот корень создает внешнее окно, которое вы увидите при запуске вашего пользовательского интерфейса, оно содержит заголовок, кнопки min / max / close в правом верхнем углу и определяет размер окна, наряду с кучей других функций. «root» — это просто условное название, это может быть «potato», но пока вы знаете, что это основа вашего пользовательского интерфейса, это то, что имеет значение. Он не будет вызываться слишком часто за пределами того первого раза, когда вы передаете его в свой класс, если вы не выполняете много манипуляций с окнами.
Оттуда вы передаете этот root (window) своему объекту MyFirstGUI. __init__
Функция будет выполняться во время создания для любого класса python, и параметрами для этой функции будут параметры, необходимые для вызова класса. В этом случае есть два параметра self и master.
«self» требуется в качестве первого параметра всех функций внутри класса, чтобы функция знала объект, которому она принадлежит, и чтобы она могла получить доступ к доступным для нее переменным уровня класса. «master» имеет значение по умолчанию None, поэтому теоретически вы могли бы вызвать MyFirstGUI()
но в этом случае мы передаем root (window) в качестве master для объекта MyFirstGUI(root)
.
На этом этапе, поскольку мы создаем экземпляр MyFirstGUI, __init__
срабатывает, и первое, что он делает, это устанавливает self.master равным входным данным master, чтобы на него можно было ссылаться в любом месте объекта, расширяя область действия за пределы только __init__
функции.
Оттуда функция произвольно определяет переменные, область действия которых ограничена на уровне класса, повторно используя self.
, чтобы эти переменные могли быть вызваны из любой части этого класса. self.label
это просто название, которое выбрал автор оригинала, опять же, оно может быть таким self.macaroni
до тех пор, пока для вас имеет смысл, что это ваш лейбл. Затем, поскольку вы импортировали класс Label из tkinter, вы можете просто ссылаться на него, как если бы он уже был в вашем коде. Когда вы вызываете эти классы, они возвращают объекты, которые устанавливаются для вашего self.label
, чтобы вы могли ссылаться на них позже в программе.
Если вы посмотрите документы, то увидите, что классы Label и Button имеют свой собственный набор доступных им параметров. Общие параметры включают в себя, как вы видите, «текст», чтобы отобразить текст, который вы хотели бы, чтобы он имел, команду, чтобы сообщить кнопке, какая функция должна срабатывать при нажатии, «ширину», чтобы определить ширину виджета на экране, и так далее.
При использовании значений по умолчанию вам не всегда нужно предоставлять все возможные параметры вызову для создания этих объектов. Решение о том, какие параметры предоставить, сводится к практике и знанию возможностей каждого класса, чтобы знать, какие значения вы хотите установить и какие для них подходящие настройки.
tldr:
- Ваши инструкции импорта вверху позволяют вам использовать классы по своему усмотрению, и ваши знания определяют, какие параметры отправлять в каждый класс. Документы — твой друг!
- Я полагаю, что ваше понимание правильное.
self.label
определяется в__init__
функции программистом, а затем присваивается объекту widget в виде tkLabel путем вызова класса. С этого моментаself.label
доступен в любом месте класса MyFirstGUI, чтобы им можно было манипулировать по своему усмотрению. Например, вместоgreet
функции, выводящей «Привет!» вы могли бы изменить эту инструкцию print наself.label.set("Greetings!")
, так что теперь ваше нажатие кнопки вместо этого изменит текст метки.
Я надеюсь, что это помогло!