我是一名 Python 和编程新手,我一直尝试使用 Tkinter 制作一个简单的 GUI 程序,但它无法运行,我不明白我得到的错误?错误是:GUI 实例没有属性 'frame',全局名称 'frame' 未定义。
2. 解决方案
-
理解 Tkinter 类: Tkinter 类是 Tkinter 库中的基本构建块,它提供了创建和管理窗口、小部件和布局的工具。为了使用 Tkinter 类,您需要创建一个类的实例并使用它来创建小部件和布局。
-
创建 Tkinter 类的实例: 要创建 Tkinter 类的实例,您可以使用以下代码:
root = Tk()
这将创建一个 Tkinter 类的实例并将其存储在变量 root 中。
- 创建小部件: 要创建小部件,您可以使用 Tkinter 类的方法。例如,要创建一个按钮,您可以使用以下代码:
button = Button(root, text="Click me!")
这将创建一个按钮并将其存储在变量 button 中。
- 添加小部件到布局: 要添加小部件到布局,可以使用 Tkinter 类的方法
pack()、grid()或place()。例如,要使用pack()方法将按钮添加到布局,您可以使用以下代码:
button.pack()
- 启动主循环: 要启动主循环,可以使用 Tkinter 类的方法
mainloop()。例如,要启动主循环,您可以使用以下代码:
root.mainloop()
这将启动主循环并在 GUI 中显示小部件。
以下是一个更正后的代码示例:
import tkinter as tk
from datetime import datetime
class GUI:
def __init__(self, master):
self.master = master
self.frame = tk.Frame(master)
self.frame.pack()
now = datetime.now()
self.date = str(now.month) + ':' + str(now.day) + ':' + str(now.year)
self.time1 = str(now.hour) + ':' + str(now.minute) + ':' + str(now.second)
temp = 14
humidity = 15
self.userinput = tk.StringVar()
self.password = tk.StringVar()
date_label = tk.Label(self.frame, text='Date : %s' % self.date)
time_label = tk.Label(self.frame, text='Time: %s' % self.time1)
temp_label = tk.Label(self.frame, text='Temperature: %d C' % temp)
hum_label = tk.Label(self.frame, text='Humidity: %d%%' % humidity)
EnterMail = tk.Label(self.frame, text='Enter Gmail username:')
EnterPass = tk.Label(self.frame, text='Enter password:')
self.mail_box = tk.Entry(self.frame, textvariable=self.userinput)
self.pass_box = tk.Entry(self.frame, textvariable=self.password)
self.EnterButton = tk.Button(self.frame, text='Enter', command=self.printer)
self.StartAlarm = tk.Button(self.frame, text='Start Alarm', command=self.startalarm)
self.StopAlarm = tk.Button(self.frame, text='Stop Alarm', command=self.stopalarm)
date_label.grid(row=0, column=0, sticky=tk.W)
time_label.grid(row=0, column=2, sticky=tk.E)
temp_label.grid(row=1, column=0, sticky=tk.W)
hum_label.grid(row=1, column=2, sticky=tk.E)
EnterMail.grid(row=4, column=0, sticky=tk.W)
EnterPass.grid(row=5, column=0, sticky=tk.W)
self.mail_box.grid(row=4, column=2)
self.pass_box.grid(row=5, column=2)
self.EnterButton.grid(row=7, column=0)
self.StartAlarm.grid(row=8, column=0)
self.StopAlarm.grid(row=10, column=0)
def startalarm(self):
alarmlabel = tk.Label(self.frame, text='Alarm Activated')
alarmlabel.grid(row=11, column=0)
# GPIO code to activate alarm
def stopalarm(self):
alarmlabel = tk.Label(self.frame, text='Alarm Deactivated')
alarmlabel.grid(row=11, column=0)
# GPIO code to deactivate alarm
def printer(self): # prints user input
self.username = self.userinput.get()
self.MailPass = self.password.get()
# Code to fetch and display unread emails
root = tk.Tk()
app = GUI(master=root)
root.mainloop()
希望这篇技术文章能够帮助您解决问题并理解 Tkinter 类。