如何创建一个函数,使窗口包含两个按钮,其中每个按钮都有一个指定的字符串,如果单击,则返回一个指定变量?类似于此视频中的@3:05https://www.khanacademy.org/science/computer-science-subject/computer-science/v/writing-a-simple-factorial-program---python-2(我知道这是一个非常简单的初学者程序的教程,但这是我能找到的唯一视频),但没有文本框,我对"确定"one_answers"取消"按钮的功能有更多的控制。
我必须创建一个窗口,画一个里面有字符串的矩形,然后做一个检查鼠标移动/鼠标点击的循环,然后在鼠标坐标在其中一个按钮内并点击鼠标后返回一些东西吗?或者有没有一个功能/一组功能可以让带按钮的窗口更容易?还是模块?
概述
不,你不必"画一个矩形,然后做一个循环"。所要做的是导入某种GUI工具包,并使用该工具包内置的方法和对象。一般来说,其中一种方法是运行一个循环,该循环侦听事件并基于这些事件调用函数。此循环称为事件循环。因此,虽然这样的循环必须运行,但您不必创建循环。
注意事项
如果你想从一个提示打开一个窗口,比如在你链接的视频中,问题就有点棘手了。这些工具包并不是为了以这种方式使用而设计的。通常,您编写一个完整的基于GUI的程序,其中所有的输入和输出都是通过小部件完成的。这并非不可能,但在我看来,在学习时,你应该坚持使用所有文本或所有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()
您应该了解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()
看看这个部分(如何创建按钮)。但从安装说明开始。
这是我的部分。我正在制作一个人工智能聊天机器人,只是在登录和绘制东西的界面上工作。我也是.json的初学者,所以这帮助我学习。
也许我也会解释一下。
首先,创建一个名为任意名称的
.json
文件。请确保该文件与代码位于同一目录路径/文件夹中,或者您可以导入操作系统来执行此操作。
下一次导入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()
接下来,让我们定义submit函数并创建按钮。这就是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个小时才明白这一点。我和其他人一样是个初学者,但请不要复制这个。用它作为一个例子来理解。即使你这样做了,也请给予表扬。但大多数情况下,不要。
#Creating a GUI for entering name
def xyz():
global a
print a.get()
from Tkinter import *
root=Tk() #It is just a holder
Label(root,text="ENter your name").grid(row=0,column=0) #Creating label
a=Entry(root) #creating entry box
a.grid(row=7,column=8)
Button(root,text="OK",command=xyz).grid(row=1,column=1)
root.mainloop() #important for closing th root=Tk()
这是最基本的一个。
tkinter是一个GUI库,此代码创建简单的无文本按钮:
import tkinter as tk
class Callback:
def __init__(self, color):
self.color = color
def changeColor(self):
print('turn', self.color)
c1 = Callback('blue')
c2 = Callback('yellow')
B1 = tk.Button(command=c1.changeColor)
B2 = tk.Button(command=c2.changeColor)
B1.pack()
B2.pack()
下面是我的方法,用一个名为"Hello!"的按钮创建一个窗口关闭后,会打开一个带有"酷!"的新窗口
from tkinter import *
def hello(event):
print("Single Click, Button-l")
def Cool(event):
print("That's cool!")
widget = Button(None, text='Hello!')
widget.pack()
widget.bind('<Button-1>', Hello)
widget.mainloop()
widget = Button(None, text='Cool!')
widget.pack()
widget.bind('<Double-1>', Cool)