【问题标题】:How to make a window with buttons in python如何在python中制作一个带有按钮的窗口
【发布时间】:2014-04-02 06:09:32
【问题描述】:

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

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

【问题讨论】:

    标签: python button module window user-input


    【解决方案1】:

    概述

    不,您不必“画一个矩形,然后做一个循环”。您要做的是导入某种 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()
    

    【讨论】:

    • 很好的例子。你能解释一下fill="both"fill="x"padx=20anchor="w"在做什么吗?
    • @AlexanderCska:您可以通过阅读 tkinter 文档获得这些问题的答案。一个好的起点是effbot.org/tkinterbook/pack.htm
    【解决方案2】:

    你应该看看wxpython,这是一个 GUI 库,如果你有一些 Python 知识的话,它很容易上手。

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

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

    看看这个section(如何创建按钮)。但是从installation instructions开始。

    【讨论】:

      【解决方案3】:

      这是我的部分。我正在制作一个 AI 聊天机器人,只是在登录界面和草绘内容上工作。我也是 .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 个小时才明白这一点。我和其他人一样是初学者,但请不要复制此内容。用它作为例子来理解。即使你这样做,请给予信任。但大多数情况下,不要。

      【讨论】:

        【解决方案4】:
        #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()
        

        这是基本的。

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

            这是我的方法,创建一个带有“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)
            

            【讨论】:

            • 为什么调用mainloop后有code?该代码不会像您认为的那样做。您还将方法Hello 绑定到事件,但您的方法名为hello。此外,最佳实践表明您不应该在按钮上使用 bind;它有一个command 属性,用于将按钮连接到一个函数。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-12-06
            • 1970-01-01
            • 2021-12-03
            • 2012-02-04
            • 2021-01-11
            • 1970-01-01
            • 2023-03-07
            相关资源
            最近更新 更多