Python 3.x Python3、Tkinter和用户输入时间请求
我在Python中的基本概念和措辞方面确实取得了一些进展,但当我们开始在混合中添加Tkinter时,我有点迷失了方向。BryanOakley在一个关于多窗口和Tkinter的问题上做出了巨大贡献,这个问题在网络上随处可见。我以他的例子为例,将它与我见过的其他一些例子结合起来,开始制作一个带有闹钟的时钟,当闹钟开始计时时,它会改变时钟的背景。问题是,我只是看不见穿过森林的树木,也不知道如何: A) 获取从Tkinter窗口显示的输入请求Python 3.x Python3、Tkinter和用户输入时间请求,python-3.x,class,methods,tkinter,clock,Python 3.x,Class,Methods,Tkinter,Clock,我在Python中的基本概念和措辞方面确实取得了一些进展,但当我们开始在混合中添加Tkinter时,我有点迷失了方向。BryanOakley在一个关于多窗口和Tkinter的问题上做出了巨大贡献,这个问题在网络上随处可见。我以他的例子为例,将它与我见过的其他一些例子结合起来,开始制作一个带有闹钟的时钟,当闹钟开始计时时,它会改变时钟的背景。问题是,我只是看不见穿过森林的树木,也不知道如何: A) 获取从Tkinter窗口显示的输入请求 B) 将alarm类中的用户输入调用到clock类中,以触发
B) 将alarm类中的用户输入调用到clock类中,以触发窗口背景更改 我认为我的问题是我不完全理解将不同的方法嵌套在哪里,以及如何获取存储用户数据的变量,并将其从字符串转换为时间格式。我想我只是需要一些指导,但是如果你认为我有点不知所措,那么请把我指给我看,这样我就可以继续练习了。这是我的想法,把这个或类似的东西放到tick()方法中,当然我想知道在Tkinter中输入到哪里。我在盘旋。帮助:
def wake(self):
self.__init__(self, hour, min)
self.hour = hour
self.min = min
input("what is the hour?",
input("What is the min?",
hour = datetime.datetime.now().strftime("%I")
min = datetime.datetime.now().strftime("%M")
if self.hour and self.min == time1():
label.config(text = time1, bg = "green")
else:
label.config(text = time1, bg = "red")
以下是我目前掌握的情况:
import tkinter as tk
from tkinter import font as tkfont
from tkinter import messagebox
import time
import datetime
class digitalClockApp(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
self.title_font = tkfont.Font(family='Helvetica', size=100, weight="bold", slant="italic")
container = tk.Frame(self)
container.pack(side = "top", fill= "both", expand =1)
container.grid_rowconfigure(0,weight = 1)
container.grid_columnconfigure(0, weight = 1)
self.frames = {}
for F in (introPage, clock, alarm):
page_name = F.__name__
frame = F(parent = container, controller = self)
self.frames[page_name] = frame
frame.grid(row = 0, column = 0, sticky = "nsew")
self.geometry("640x480")
self.show_frame("introPage")
def show_frame(self, page_name):
frame = self.frames[page_name]
frame.tkraise()
class introPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
label = tk.Label(self, text = "Welcome", bg = "black", fg = "white", font = controller.title_font)
label.pack(side = "top", fill = "both", expand = 1)
button1 = tk.Button(self, text = "Go to Clock", command = lambda: controller.show_frame("clock"))
button2 = tk.Button(self, text = "Go to Set Alarm", command = lambda: controller.show_frame("alarm"))
button1.pack(side = "left")
button2.pack(side = "left")
class clock(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
label = tk.Label(self, text = "", bg = "black", fg = "white", font = controller.title_font)
label.pack(side = "top", fill = "both", expand = 1)
button = tk.Button(self, text = "Home Screen", command = lambda: controller.show_frame("introPage"))
button.pack()
def tick(time1 = ""):
time2 = time.strftime("%I:%M:%S")
if time2 != time1:
time1 = time2
label.config(text = time1, bg = "red")
label.after(200, tick)
tick()
class alarm(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
label = tk.Label(self, text = "", bg = "black", fg = "white", font = controller.title_font)
label.pack(side = "top", fill = "both", expand = 1)
def wake():
button = tk.Button(self, text = "Home Screen", command = lambda: controller.show_frame("introPage"))
button.pack()
if __name__ == "__main__":
app = digitalClockApp()
app.mainloop()
坦白地说,我认为对于学习使用tkinter的人来说,切换帧的概念是一个糟糕的选择。这个例子从来没有打算作为初学者的起点,特别是像闹钟这样简单的东西。它增加了大量的开销,但带来的好处却微乎其微 我的建议是从一个窗口重新开始。添加小时和分钟的输入小部件、显示时钟的标签和启动时钟的按钮。这就是你做这个练习所需要的。可能需要几十行代码 您的
tick
方法可能或多或少可以按原样使用,不过如果您只显示整秒的时间,我看不出每秒更新时钟五次有什么意义
只有在你开始工作之后,你才应该开始尝试使用高级架构,比如“交换帧”代码 谢谢你的帮助!所以,我在尝试你的建议,但一旦我在一个类中添加了多个方法,我就挂断了。似乎我可以定义类,让时钟运行,但当我尝试添加一个报警按钮时,我就会出现属性错误,或者在定义变量之前指示调用变量的错误。使用Tkinter时,类中方法的顺序有什么诀窍吗?@RL_NooB:除了标准编程实践之外,没有其他诀窍:在使用它们之前定义东西,在多个地方保存对需要的东西的引用,等等。我会继续。我想我刚开始的时候已经吃不下了,但我在这里奋斗,学到了很多。再次感谢。