如何在Python中制作带按钮的窗口
我想创建一个窗口,里面有两个按钮,每个按钮都有一个指定的文字。如果点击其中一个按钮,就返回一个特定的变量。这个想法有点像这个视频里的内容,虽然那个视频是教初学者写一个简单的程序,但我找不到其他视频了。我的需求是,不需要文本框,而且我想对“确定”和“取消”按钮的功能有更多的控制。
我是不是需要先创建一个窗口,然后画一个矩形,里面写上文字,再写一个循环来检查鼠标的移动和点击?当鼠标在按钮上并且被点击时,返回某个值?还是说有更简单的函数或者模块可以直接创建带按钮的窗口呢?
6 个回答
这是我的部分。我正在制作一个人工智能聊天机器人,现在在搞登录界面和一些草图。我也是刚开始接触.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个小时才弄明白这些。我和大家一样都是初学者,但请不要抄袭。把它当作理解的例子。如果你真的要用,请给我点个赞。但最重要的是,不要抄袭。
概述
不,你不需要“先画个矩形,然后再做个循环”。你需要做的是导入某种图形用户界面(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()