如何通过单击按钮重新启动 tkinter/python 程序?

How to restart tkinter/python program on click of a button?

Incorrect-Dimiss 按钮会在单击和按下 Return 键时擦除,但如果我之后输入任何内容,则没有任何反应。问题是,如果我输入正确,登录按钮会弹出并且可以正常工作。如果我输入不正确,会弹出关闭按钮,然后单击或按 enter 将其删除。现在,我在一次错误的尝试后输入的任何内容,无论是正确的还是错误的,都没有任何作用。

(1) 为了避免这种情况,我想知道程序是否可以在 clicking/pressing 上重新启动,输入关闭按钮,而无需 window 关闭或再次重新打开,但我这样做了不知道该怎么做。

(2)还有 ends/restarts 程序的最大登录尝试次数代码吗?如果有,我该如何将其放入此代码中? (比如如果 >3 不正确然后退出)

这是代码 (python3)- 如果您愿意,可以自己尝试一下:

from tkinter import *

class Application(object):
    def __init__(self, event=None):
        self.root = Tk()

        self.root.configure(bg="darkorchid1", padx=10, pady=10)
        self.root.title("WELCOME")

        self.username = "Bob"

        self.welcome = Label(self.root, text="WELCOME TO MY PROGRAM", bg="lightgrey", fg="darkorchid1")
        self.welcome.pack()

        self.label0 = Label(self.root, text="ENTER NAME:", bg="purple", fg="white", height=5, width=50)
        self.label0.pack()

        self.entry = Entry(self.root, width=25)
        self.entry.configure(fg= "white",bg="grey20")
        self.entry.pack()
        self.entry.bind("<Return>", self.submit)

        self.button = Button(self.root, text="SUBMIT", highlightbackground="green", width=48, command=self.submit)
        self.button.pack()

    def submit(self, event=None):
        username = self.entry.get()
        if username == self.username:
            self.button1 = Button(self.root, text='LOGIN', highlightbackground="green", width=28, command=self.root.destroy)
            self.button1.pack()
            self.entry.bind("<Return>", self.login)

        else:
            self.button2 = Button(self.root, text="INCORRECT- CLICK TO DIMISS THIS MESSAGE", highlightbackground="red", width=48, command=self.incorrect)
            self.button2.pack()
            self.entry.bind("<Return>", self.incorrect)

    def incorrect(self, event=None):
        self.button2.destroy()

    def login(self, event=None):
        self.root.destroy()


app=Application()

mainloop()

我不想破坏按钮,而是希望它重新启动程序,但找不到正确的命令。这会破坏按钮,因为它在程序开始时不存在,并且允许不正确或正确的输入在第一次尝试后实际工作。

    def incorrect(self, event=None):
        self.button2.destroy()

我是初学者所以越简单越好。谢谢。

我自己不是专家,但前段时间摆弄过 TKinter。据我所知,重启 TKinter 应用程序的唯一方法是 运行 它在一个线程中,然后终止并重新启动该线程。我建议您看一下 Python 的 multiprocessing or threading 模块。

你也可以尝试(过去对我有用,但我想这并不是正确的方法)是将 ROOT = Tk() 作为全局变量,然后提交-按钮作为一个独立的 class 并让它在执行 ROOT.Destroy() 之前导入 global ROOT 然后让它再次调用应用程序 class ,这也可以调用全局变量(这会导致它重新开始)。这是我在使用它时用来更新 TKinter window 的一种方法。但据我所知,线程方法经常被提及为执行此操作的正确方法..

作为一个非常有限的例子(对于更广泛的例子来说时间很短),我在我的旧脚本中做了这样的事情:

ROOT_WINDOW = ""
VARIABLE1 = 'some variable here'

def func1():

    global ROOT_WINDOW
    global VARIABLE1
    ROOT_WINDOW = Tk()
    #(Insert application code that uses or requires variable1)
    func2()

def func2():
    global ROOT_WINDOW
    global VARIABLE1
    ROOT_WINDOW.Destroy()
    Change variable1
    func1() 

关于设置最大登录尝试次数。我通过创建一个单独的启动脚本解决了这个问题。它工作正常,但我不敢在这里 post 它,因为它是解决安全问题(必须将您的 sudo 密码存储在变量中)的问题的真正丑陋且不正确的方法。

抱歉无法提供更多帮助。

首先,我会将 return 的绑定更改为根目录 window 而不是条目(否则您必须单击 return 的条目字段才能效果)

接下来,您的 class 需要 3 个状态变量。

self.button1 = None
self.button2 = None
self.attempts = 0

然后通过检查每个你可以完成(我认为)你想要的状态

这是修改后的全部代码

from tkinter import *

class Application(object):

    def __init__(self, event=None):

        self.root = Tk()

        self.root.configure(bg="darkorchid1", padx=10, pady=10)
        self.root.title("WELCOME")

        self.username = "Bob"

        self.welcome = Label(self.root, text="WELCOME TO MY PROGRAM", bg="lightgrey", fg="darkorchid1")
        self.welcome.pack()

        self.label0 = Label(self.root, text="ENTER NAME:", bg="purple", fg="white", height=5, width=50)
        self.label0.pack()

        self.entry = Entry(self.root, width=25)
        self.entry.configure(fg= "white",bg="grey20")
        self.entry.pack()
        self.root.bind("<Return>", self.submit)

        self.button = Button(self.root, text="SUBMIT", highlightbackground="green", width=48, command=self.submit)
        self.button.pack()

        self.button1 = None
        self.button2 = None
        self.attempts = 0

    def submit(self, event=None):
        username = self.entry.get()
        if username == self.username:
            if (self.button2 != None): # after I added disabling the submit button this check might not be necessary
                return
            if (self.button1 == None):
                self.button1 = Button(self.root, text='LOGIN', highlightbackground="green", width=28, command=self.root.destroy)
                self.button1.pack()
                self.root.bind("<Return>", self.login)
                self.button.config(state="disabled")
        else:
            if (self.button2 == None):
                self.button2 = Button(self.root, text="INCORRECT- CLICK TO DIMISS THIS MESSAGE", highlightbackground="red", width=48, command=self.incorrect)
                self.button2.pack()
                self.root.bind("<Return>", self.incorrect)
                self.button.config(state="disabled")

    def incorrect(self, event=None):
        self.attempts += 1
        if (self.attempts > 2):
            self.root.destroy()
        else:
            self.root.bind("<Return>", self.submit)
            self.button.config(state="normal")
            self.button2.destroy()
            self.button2 = None

    def login(self, event=None):
        self.root.destroy()

app=Application()

mainloop()