繁体   English   中英

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

[英]How to make a window with buttons in python

如何创建一个函数来创建一个带有两个按钮的窗口,其中每个按钮都有一个指定的字符串,如果单击,则返回一个指定的变量? 类似于此视频中的@ 3:05 https://www.khanacademy.org/science/computer-science-subject/computer-science/v/writing-a-simple-factorial-program---python-2 (我知道这是一个非常简单的初学者程序的教程,但它是我能找到的唯一视频)但没有文本框,而且我对“确定”和“取消”按钮的作用有更多的控制。

我是否必须创建一个窗口,在其中绘制一个带有字符串的矩形,然后创建一个循环来检查鼠标移动/鼠标点击,然后在鼠标坐标位于其中一个按钮内时返回一些东西,并且鼠标被点击了? 或者是否有一个功能/一组功能可以使带有按钮的窗口更容易? 还是模块?

概述

不,您不必“绘制矩形,然后进行循环”。 需要做的是进口某种形式的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 ,如果你有一些 Python 知识,它是一个很容易开始的 GUI 库。

以下代码将为您创建一个窗口( 源代码):

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文件,命名为您喜欢的任何名称。 确保文件与代码位于同一目录路径/文件夹中,或者您可以导入 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 个小时来理解这一点。 我是一个初学者,就像其他人一样,但请不要复制此。 举个例子来理解。 即使你这样做,请给予信任。 但大多数情况下,不要。

#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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM