Кадр объекта не имеет атрибута

Часть программы с графическим интерфейсом, которую я создаю, должна иметь возможность преобразовывать время, указанное в секундах. Класс кадров в моем GUI, который делает это, доставляет мне некоторые проблемы. Я создал переменную экземпляра типа combobox для хранения параметров для типов периода времени для преобразования. Я ограничил выбор в выпадающем списке, чтобы преобразовать время ввода в секунды. Я хочу связать ввод значений в поле ввода с тем же. Я пытался вызвать функцию преобразования в моей функции команды проверки для поля ввода, но он говорит мне, что мой объект кадра "PERIODIC" не имеет атрибута period_type. Я запутался, потому что я назвал combobox как переменную экземпляра, и он должен быть доступен для всех в классе. "self.period_type" прямо там, в моем init. Почему я не могу получить доступ к этой переменной? Я что-то упускаю до боли?

Трассировка, которую я получаю:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:Users4D_UserAppDataLocalProgramsPythonPython38-32lib	kinter\__init__.py", line 1883, in __call__
    return self.func(*args)
  File "C:/Users/PycharmProjects/LoggerProject/Scripts/ProblemExample.py", line 37, in ValidateTime
    self.convert_time(self.period_type.get())
AttributeError: 'PERIODIC' object has no attribute 'period_type'<

Это мой код:

from tkinter import ttk
import re

root = tk.Tk()

class PERIODIC(tk.Frame):
    def __init__(self, container, **kwargs):
        super().__init__(container, **kwargs)
        self.time_unconverted = tk.DoubleVar()
        self.time_converted = tk.DoubleVar()
        self.periodic_label = tk.Label(self, text="PERIODIC")
        self.periodic_label.grid(row=0, columnspan=2, sticky="NSEW")
        trigger_option_label = ttk.Label(self, text="Trigger Every: ")
        trigger_option_label.grid(row=1, column=0)
        vcmd = (self.register(self.ValidateTime), '%P')
        self.num_period = tk.Entry(self,textvariable=self.time_unconverted, validate="key", validatecommand=vcmd)
        self.num_period.grid(row=1, column=1)
        self.period_type = ttk.Combobox(self, values=["seconds", "minutes", "hours", "days"])
        self.period_type.bind("<<ComboboxSelected>>", lambda y: self.convert_time(self.period_type.get()))
        self.period_type.grid(row=1, column=2)

    def convert_time(self, type):
        if type == 'seconds':
            self.time_converted.set(self.time_unconverted.get())
        if type == 'minutes':
            self.time_converted.set(self.time_unconverted.get() * 60)
        if type == 'hours':
            self.time_converted.set(self.time_unconverted.get() * 3600)
        if type == 'days':
            self.time_converted.set(self.time_unconverted.get() * 86400)


    def ValidateTime(self, P):
        test = re.compile('^[0-9]{1,3}?.?[0-9]?$')
        if test.match(P):
            self.convert_time(self.period_type.get())
            return True
        else:
            return False

frame = PERIODIC(root)
frame.grid(row=0,column=0)
root.mainloop()

Всего 1 ответ


Ваша команда проверки запускается при создании записи и использует self.period_type который еще не определен.

Простое решение - перенести создание комбинированного списка перед созданием записи.


Есть идеи?

10000