Python3、Tkinter 和用户输入时间请求
Python3, Tkinter, and User input request for time
我确实在 Python 中的基本概念和措辞上取得了一些进展,但是当我们开始将 Tkinter 添加到组合中时,我有点不知所措。 BryanOakley 对网络上随处可见的关于多个 windows 和 Tkinter 的问题做出了巨大贡献。我以他的例子为例,将它与我见过的其他一些例子结合起来,并开始制作一个带有闹钟的时钟,当闹钟时间开始时,它应该改变时钟背景。问题是,我只是看不到树木森林,不知道如何:
A) Get input request to appear from the Tkinter window
B) Call the user's input in the alarm class into the clock class to trigger a window background change.
我认为我的问题是我不完全理解在哪里嵌套不同的方法以及如何获取存储用户数据的变量,并不时将其格式化为字符串。我想我只需要一些指导,但如果你认为我无法理解,那么请指出我浅薄的一端,这样我就可以继续练习。这是我的想法,将这个或类似的东西放入 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 的人来说是一个糟糕的选择。该示例从未打算用作初学者的起点,尤其是对于像闹钟这样简单的东西。它增加了很多开销,却收效甚微。
我的建议是从一个 window 开始。添加小时和分钟的条目小部件、显示时钟的标签和启动时钟的按钮。这就是本练习所需的全部内容。可能只有几十行代码。
您的 tick
方法可能或多或少可以按原样使用,但如果您只显示整秒的时间,我看不到每秒更新时钟五次的意义。
只有在你开始工作之后,你才应该开始尝试使用像 "switching frames" 代码这样的高级架构。
我确实在 Python 中的基本概念和措辞上取得了一些进展,但是当我们开始将 Tkinter 添加到组合中时,我有点不知所措。 BryanOakley 对网络上随处可见的关于多个 windows 和 Tkinter 的问题做出了巨大贡献。我以他的例子为例,将它与我见过的其他一些例子结合起来,并开始制作一个带有闹钟的时钟,当闹钟时间开始时,它应该改变时钟背景。问题是,我只是看不到树木森林,不知道如何:
A) Get input request to appear from the Tkinter window
B) Call the user's input in the alarm class into the clock class to trigger a window background change.
我认为我的问题是我不完全理解在哪里嵌套不同的方法以及如何获取存储用户数据的变量,并不时将其格式化为字符串。我想我只需要一些指导,但如果你认为我无法理解,那么请指出我浅薄的一端,这样我就可以继续练习。这是我的想法,将这个或类似的东西放入 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 的人来说是一个糟糕的选择。该示例从未打算用作初学者的起点,尤其是对于像闹钟这样简单的东西。它增加了很多开销,却收效甚微。
我的建议是从一个 window 开始。添加小时和分钟的条目小部件、显示时钟的标签和启动时钟的按钮。这就是本练习所需的全部内容。可能只有几十行代码。
您的 tick
方法可能或多或少可以按原样使用,但如果您只显示整秒的时间,我看不到每秒更新时钟五次的意义。
只有在你开始工作之后,你才应该开始尝试使用像 "switching frames" 代码这样的高级架构。