Как я могу создать класс и объект для виджета tkinter в Python?

#python #class #object #tkinter #instantiation

Вопрос:

спасибо за чтение:

ЦЕЛЬ:
Я практикуюсь в использовании ООП и хотел создать класс с переменными класса для виджета метки, который я создаю с помощью tkinter. Таким образом, я могу создавать множество надписей, и мне не нужно указывать один и тот же шрифт, размер шрифта, цвета и т. Д. Для каждой из Них.

ПРОБЛЕМА:
Я не могу понять, как я могу вызвать экземпляр класса, когда ему также необходимо ссылаться на метод tkinter. (В качестве альтернативы, должен ли я даже пытаться включить ссылку на tkinter при создании класса?)

Вот пример того, что у меня есть:

 import tkinter as tk class ui_Labels:  "This class sets the baseline characteristics for the widgets, including font, font size, and colors"  #If I understand correctly, below are called class attributes#  tkLabel = tk.Label  rootRef = uiRoot  varFont = "Calibri"  fontSize = 14  varFG = "f2f2f2"  varBG = "#3b3b3b"    #Constructor  def __init__(self, name, varText):  self.name = name  self.varText = varText  # CLASS OBJECTS sectionHeader = ui_Labels("Section Header","Magic XML Iterator")  # Attempt to call the instance (not sure if that's the correct phrasing tk.Label(sectionHeader)  

Когда следует вызывать объект SectionHeader в качестве tk.Пометьте, я получу сообщение об ошибке атрибута: «Объект ui_Labels не имеет атрибута «tk».

Похоже, в сообщении говорится, что мне нужно сослаться на метод tk в классе, но я не был уверен, как лучше это сделать.

TL;DR Вопрос:
У кого-нибудь есть предложения о том, как лучше всего написать класс или связанные с ним объекты для создания шаблонов виджетов tkinter?

Спасибо!

Всего наилучшего,
Крис

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

1. Существование вашего класса каким-то образом не меняет того, какие параметры tk.Label() принимает. Первый параметр-это родительский виджет (обычно окно или рамка), который должен содержать новый виджет; ваш класс не является чем-то подобным.

Ответ №1:

Вы не хотите Label , чтобы a был атрибутом класса. Вместо этого вам нужно определить Label вход __init__ . Вам также необходимо передать корень/родитель в качестве аргумента, __init__ чтобы вы могли использовать его для создания метки. Вы не можете использовать его в качестве атрибута, поскольку он не обязательно один и тот же каждый раз и независимо от этого не был определен в вашем коде.

По сути, вам нужен пользовательский виджет, который вы можете создавать, группировать/упаковывать и взаимодействовать с ним как с обычным виджетом, но с некоторыми пользовательскими параметрами. Более правильным примером того, как создать пользовательский виджет в качестве класса, используя ваш код, является:

 import tkinter as tk  # Your class class ui_Labels():  '''This class sets the baseline characteristics   for the widgets, including font, font size, and colors  '''   # Attributes  varFont = "Calibri"  fontSize = 14  varFG = "#F2F2F2"  varBG = "#3b3b3b"    # Constructor  def __init__(self, parent, name, varText):  self.parent = parent  self.name = name  self.varText = varText   self.label = tk.Label(  parent,   text = varText,   fg = self.varFG,   bg = self.varBG,   font = (self.varFont, self.fontSize)  )   # Allows you to grid as you would normally  # Can subsitute pack() here or have both class methods  def grid(self, **kwargs):  self.label.grid(kwargs)   # Main GUI root = tk.Tk()  # Create an instance of your class sectionHeader = ui_Labels(root, "Section Header","Magic XML Iterator") sectionHeader.grid(row=1, column=2)  root.mainloop()  

Ответ №2:

Я бы предложил вам пройти несколько учебных пособий по Python OOP.

Ниже приведен пример создания пользовательского класса меток на основе вашего кода:

 import tkinter as tk  # custom label class inherited from tk.Label class ui_Label(tk.Label):  '''  This class sets the baseline characteristics for the widget,  including font, font size and colors  '''   # class attributes  varFont = "Calibri"  fontSize = 14  varFG = "#f2f2f2"  varBG = "#3b3b3b"   # Constructor: added parent argument  def __init__(self, parent, name, varText):  kwargs = {  'text': varText,  'font': (self.varFont, self.fontSize),  'fg': self.varFG,  'bg': self.varBG,  }  # need to call constructor of inherited class  super().__init__(parent, **kwargs)  # I don't know what the purpose of 'name' is  # so just use an instance variable to save it  self.name = name  root = tk.Tk()  # create instance of custom label sectionHeader = ui_Label(root, "Section Header", "Magic XML Iterator") sectionHeader.pack()  root.mainloop()