如何在Python中制作带按钮的窗口

8 投票
6 回答
111643 浏览
提问于 2025-04-17 20:23

我想创建一个窗口,里面有两个按钮,每个按钮都有一个指定的文字。如果点击其中一个按钮,就返回一个特定的变量。这个想法有点像这个视频里的内容,虽然那个视频是教初学者写一个简单的程序,但我找不到其他视频了。我的需求是,不需要文本框,而且我想对“确定”和“取消”按钮的功能有更多的控制。

我是不是需要先创建一个窗口,然后画一个矩形,里面写上文字,再写一个循环来检查鼠标的移动和点击?当鼠标在按钮上并且被点击时,返回某个值?还是说有更简单的函数或者模块可以直接创建带按钮的窗口呢?

6 个回答

1

这是我的部分。我正在制作一个人工智能聊天机器人,现在在搞登录界面和一些草图。我也是刚开始接触.json,所以这个过程帮我学习了很多。

我可能还会解释一下。

首先,创建一个名字随便的 .json 文件。确保这个文件和你的代码在同一个文件夹里,或者你可以用os模块来处理这个问题。

接下来,导入Tkinter模块。这个模块可能是自带的,也可能不是,试试看就知道了。还要导入JSON模块,时间模块不是必须的,但有时会有帮助。

import tkinter as tk
import json
import time

然后,创建一个窗口,让所有的操作都在这里进行。如果需要,可以编辑窗口的信息。

app = tk.Tk()
app.wm_title("Sign Up or Log in")
app.geometry("500x300")

如果想的话,可以添加一个标签。

k = tk.Label(text = "Hello there, I'm Lola! We'll talk soon. Just let me know your credentials!\nJust click on sign up below so that I can identify you!", justify="left")
k.pack()

再添加一个按钮,让用户可以点击。

sign_in = tk.Button(text="Sign Up or Log In", command=signin)
sign_in.pack()

我们需要为上面提到的按钮定义一个登录功能。所以在创建按钮之前,我们先定义这个功能。这个过程有点长,我就简单说一下主要部分。 我们首先获取用户的详细信息,然后再进行检查。

def signin():
em = tk.Label(text="Email:")
em.pack()
en1 = tk.Entry(width=50)
en1.pack()
pa = tk.Label(text="Password:")
pa.pack()
en2 = tk.Entry(width=50)
en2.pack()
na = tk.Label(text="Name:")
na.pack()
en3 = tk.Entry(width=50)
en3.pack()

接下来,定义提交功能并创建按钮。这就是json派上用场的时候。我们首先获取详细信息,并将其存储在一个变量中。

def submit():
    email = str(en1.get())
    password = str(en2.get())
    name = str(en3.get())
    login = tk.Label(text="")

然后,我们不能忘记先读取json文件。

with open("info.json", "r") as f:
        users = json.load(f)

现在开始检查信息。

if email in users:
        login.config(text="You already have an account! Click log in please!")
        loginn = tk.Button(text = "Log in", command = login)
    else:
        users[email] = {}
        users[email]["Password"] = password
        users[email]["Name"] = name
        with open("info.json", "w") as f:
            json.dump(users, f)
        login.config(text=f"You've successfully created an account. Just click on log in below! Credentials:\nEmail: {email}\nPassword: {password}\nName: {name}")
    login.pack()

接下来,我们定义登录功能。其他的基本上都是类似的。

def loggin():
    email = str(en1.get())
    password = str(en2.get())
    name = str(en3.get())
    login = tk.Label(text="")
    with open("info.json", "r") as f:
        users = json.load(f)
    if not email in users:
        login.config(text="You don't have an account, sign up instead!")
    else:
        passs = users[email]["Password"]
        if password != passs:
            login.config(text="Wrong credentials. It doesn't match what I've recorded")
        else:
            login.config(text="Success! You've logged in. Please wait, as the software is still in the early stage of development.\nYou might have to sign up again later. I'll let you know soon.")
    login.pack()
loginn = tk.Button(text = "Log in", command = loggin)
loginn.pack()

最后,这一行代码将决定一切是否能正常工作。确保把它放在代码的最后。

window.mainloop()

这就是全部了,请不要抄袭这个,我花了5个小时才弄明白这些。我和大家一样都是初学者,但请不要抄袭。把它当作理解的例子。如果你真的要用,请给我点个赞。但最重要的是,不要抄袭。

1

你可以看看wxpython,这是一个图形用户界面(GUI)库,如果你有一些Python基础,使用起来会很简单。

下面的代码会为你创建一个窗口(来源):

import wx

app = wx.App(False)  # Create a new app, don't redirect stdout/stderr to a window.
frame = wx.Frame(None, wx.ID_ANY, "Hello World") # A Frame is a top-level window.
frame.Show(True)     # Show the frame.
app.MainLoop()

你可以查看这个部分(如何创建按钮)。不过,最好先从安装说明开始。

18

概述

不,你不需要“先画个矩形,然后再做个循环”。你需要做的是导入某种图形用户界面(GUI)工具包,然后使用这个工具包里自带的方法和对象。一般来说,这些方法中会有一个是运行一个循环,这个循环会监听事件,并根据这些事件调用相应的函数。这个循环叫做事件循环。所以,虽然这个循环必须运行,但你不需要自己去创建它。

注意事项

如果你想从一个提示框打开一个窗口,比如你链接的视频里那样,问题就有点复杂了。这些工具包并不是为了这种方式设计的。通常情况下,你需要写一个完整的基于GUI的程序,所有的输入和输出都是通过小部件(widgets)来完成的。这并不是不可能,但我认为在学习的时候,最好是专注于纯文本或者纯GUI,而不要把两者混在一起。

使用Tkinter的示例

比如,有一个这样的工具包叫做tkinter。Tkinter是Python自带的工具包。其他工具包,比如wxPython、PyQT等,使用起来也很相似,效果也很好。Tkinter的好处在于你可能已经有了它,而且它是学习GUI编程的绝佳工具。对于更高级的编程来说,它也很棒,尽管会有人对此持不同意见,但你可以不必在意这些。

下面是一个使用Tkinter的示例。这个示例适用于Python 2.x。如果你使用Python 3.x,你需要从tkinter导入,而不是Tkinter

import Tkinter as tk

class Example(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)

        # create a prompt, an input box, an output label,
        # and a button to do the computation
        self.prompt = tk.Label(self, text="Enter a number:", anchor="w")
        self.entry = tk.Entry(self)
        self.submit = tk.Button(self, text="Submit", command = self.calculate)
        self.output = tk.Label(self, text="")

        # lay the widgets out on the screen. 
        self.prompt.pack(side="top", fill="x")
        self.entry.pack(side="top", fill="x", padx=20)
        self.output.pack(side="top", fill="x", expand=True)
        self.submit.pack(side="right")

    def calculate(self):
        # get the value from the input widget, convert
        # it to an int, and do a calculation
        try:
            i = int(self.entry.get())
            result = "%s*2=%s" % (i, i*2)
        except ValueError:
            result = "Please enter digits only"

        # set the output widget to have our result
        self.output.configure(text=result)

# if this is run as a program (versus being imported),
# create a root window and an instance of our example,
# then start the event loop

if __name__ == "__main__":
    root = tk.Tk()
    Example(root).pack(fill="both", expand=True)
    root.mainloop()

撰写回答