Tkinter 类让我困惑(基础)

78 阅读2分钟

我是一名 Python 和编程新手,我一直尝试使用 Tkinter 制作一个简单的 GUI 程序,但它无法运行,我不明白我得到的错误?错误是:GUI 实例没有属性 'frame',全局名称 'frame' 未定义。

2. 解决方案

  1. 理解 Tkinter 类: Tkinter 类是 Tkinter 库中的基本构建块,它提供了创建和管理窗口、小部件和布局的工具。为了使用 Tkinter 类,您需要创建一个类的实例并使用它来创建小部件和布局。

  2. 创建 Tkinter 类的实例: 要创建 Tkinter 类的实例,您可以使用以下代码:

root = Tk()

这将创建一个 Tkinter 类的实例并将其存储在变量 root 中。

  1. 创建小部件: 要创建小部件,您可以使用 Tkinter 类的方法。例如,要创建一个按钮,您可以使用以下代码:
button = Button(root, text="Click me!")

这将创建一个按钮并将其存储在变量 button 中。

  1. 添加小部件到布局: 要添加小部件到布局,可以使用 Tkinter 类的方法 pack()grid()place()。例如,要使用 pack() 方法将按钮添加到布局,您可以使用以下代码:
button.pack()
  1. 启动主循环: 要启动主循环,可以使用 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 类。