Итак, у меня есть два файла python, каждый из которых содержит два окна tkinter. Один - это экземпляр Root Tk, а другой - экземпляр Toplevel Tk. Я пытаюсь получить две строковые переменные в экземпляре Toplevel из экземпляра Root, называемые self.taskhours, и self.taskminutes в экземпляре Root после открытия экземпляра Toplevel. Я совершенно уверен, что не передаю экземпляр Root экземпляру Toplevel должным образом. Кто-нибудь может помочь?
Вот первый файл с именем "timex.py":
import tkinter as tk
from tkinter import ttk
class TimeX(tk.Frame):
def __init__(self,master):
# INIT WINDOW
import datetime
tk.Frame.__init__(self,master=master)
self.pack()
self.master.title("TimeX") # Add title to main window
# TOP MENU #
self.master.menu = tk.Menu(master)
# TOP MENU # FILE MENU #
self.master.filemenu = tk.Menu(self.master.menu)
self.master.menu.add_cascade(label="File",menu=self.master.filemenu)
self.master.menu.add_command(label="New File",command=self.new_file)
self.frames = [
tk.Frame(self), # TASKITEM
tk.Frame(self), # TIME INPUT
tk.Frame(self), # INIT BUTTON
# tk.Frame(self), # SHOWS 00:00:00 until INIT BUTTON PRESSED
]
# START FRAME 0
frame = self.frames[0]
self.taskitem = tk.StringVar(self,"TaskItem") # Entry
# self.taskplan = tk.StringVar(self) # Listbox
# self.taskdesc = tk.StringVar(self) # Textbox
frame.entries = [
tk.Entry(frame,textvariable=self.taskitem),
]
for i,entry in enumerate(frame.entries):
entry.grid(row=0,column=i)
frame = self.frames[1]
# THE REAL
# self.taskhours = tk.StringVar(self,"Hours")
# self.taskminutes = tk.StringVar(self,"Minutes")
# THE FOO
self.taskhours = tk.StringVar(self,"1")
self.taskminutes = tk.StringVar(self,"30")
frame.labels = [
tk.Label(frame,text="Estimated Duration")
]
frame.entries = [
tk.Entry(frame,textvariable=self.taskhours),
tk.Entry(frame,textvariable=self.taskminutes)
]
# frame.menubuttons = [
# tk.Menubutton(frame,text="Hour(s)",textvariable=self.taskhours),
# tk.Menubutton(frame,text="Minute(s)",textvariable=self.taskminutes)
# ]
# self.tasktime = [int(self.taskhours.get()),int(self.taskminutes.get())]
# frame.items = frame.labels + frame.menubuttons
frame.items = frame.labels + frame.entries
for i,item in enumerate(frame.items):
item.grid(row=0,column=i)
frame = self.frames[2]
frame.buttons = [
tk.Button(frame,text="Start Task",command=self.start_timer).pack()
]
# for i,button in enumerate(frame.buttons):
# button.grid(row=0,column=i)
for frame in self.frames:
for child in frame.winfo_children():
child.grid_configure(padx=5,pady=5)
frame.pack(padx=10,pady=10,anchor="w")
def start_timer(self):
import timer
timer.run()
def new_file(self):
# import new_file
# new_file.run()
pass
def run():
root = tk.Tk()
app = TimeX(root)
app.mainloop()
run()
и вот второй файл с именем "timer.py":
import tkinter as tk
# import time
from datetime import datetime
# timeVar : MM
class Window(tk.Frame):
def __init__(self,master):
tk.Frame.__init__(self,master=master)
self.pack()
self.master.title("Timer")
self.time = tk.StringVar(self,"00:00:00")
self.label = tk.Label(self,text=self.time.get()).pack()
self.totalseconds = self.tasktime_to_total_seconds(self.taskhours.get(),self.taskminutes.get())
self.countdown(totalseconds)
def tasktime_to_total_seconds(taskhours,taskminutes):
taskhours = int(taskhours)
taskminutes = int(taskminutes)
totalseconds = taskhours * 3600 + taskminutes * 60
return totalseconds
def countdown(totalseconds):
if totalseconds == 1:
self.label.configure(text="On to the next!")
tk.Button(self,text="Close Window",command=self.quit)
totalseconds = totalseconds - 1
stdtime = total_seconds_to_standard(totalseconds)
self.time.set(stdtime)
self.label.configure(text=self.time)
self.master.after(1000,self.countdown)
def total_seconds_to_standard(total_seconds):
seconds = total_seconds
hoursec = seconds - seconds % 3600
hours = int(hoursec/3600)
seconds = seconds - hoursec
minutesec = seconds - seconds % 60
minutes = int(minutesec/60)
seconds = seconds - minutesec
standard = str(hours) + ":" + str(minutes) + ":" + str(seconds)
return standard
def run():
top = tk.Toplevel()
window = Window(top)
и ошибка, которую я получаю при открытии второго окна нажатием кнопки «Начать задание»:
"AttributeError: объект 'Window' не имеет атрибута 'taskhours'"
Очевидно, это вопрос правильной передачи корневого объекта в объект верхнего уровня, но я не уверен в точной реализации! Заранее благодарим за любую помощь!
Чтобы заставить это работать, я просто собирался хранить переменные в файле, но это не самый лучший способ сделать это, поэтому я подумал, что увижу, что интернет-браузер сказал по этому поводу.