如何在单击按钮时重启tkinter / python程序?

时间:2017-03-11 19:33:43

标签: python python-3.x tkinter tk python-3.6

当按下Return键时,Incorrect-Dimiss按钮会消失,但如果我之后输入任何内容,则不会发生任何事情。问题是,如果我输入正确,登录按钮会弹出并运行。如果输入错误,则会弹出“关闭”按钮,单击或按Enter将删除它。现在,我在错误尝试后输入的任何内容,无论是正确还是不正确都无效。

(1)为了避免这种情况,我想知道程序是否可以在点击/按下时重新启动输入关闭按钮,没有窗口关闭或其他重新打开,但我不知道该怎么做。

(2)还有一个最大登录尝试代码,用于结束/重新启动程序,如果是,我将如何将它放在此代码中? (如果> 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()

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

2 个答案:

答案 0 :(得分:3)

不是自己的专家,而是前段时间在TKinter上摆弄。据我所知,重新启动TKinter应用程序的唯一方法是在线程中运行它然后杀死并重新启动该线程。我建议你看一下Python的multiprocessingthreading模块。

你可以尝试的东西(在过去对我有用,但我认为这不是真正的正确方法)是将ROOT = Tk()作为全局变量,然后让你的提交按钮作为一个独立的类,并在执行global ROOT之前导入ROOT.Destroy(),然后让它再次调用应用程序类,这也可以调用全局变量(这将导致它再次启动)。这是我在使用它时用来更新TKinter窗口的方法。但据我所知,线程方法通常被认为是这样做的正确方法。

作为一个非常有限的例子(对于更广泛的例子来说时间不够),我在我的旧剧本中做了类似的事情:

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

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

很抱歉无法获得更多帮助。

答案 1 :(得分:1)

首先,我会更改绑定以返回到根窗口而不是条目(否则您必须单击输入字段才能使返回生效)

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

weak_ptr

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

这是修改后的整个代码

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