#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()