当按下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()
我是初学者,所以越简单越好。谢谢。
答案 0 :(得分:3)
不是自己的专家,而是前段时间在TKinter上摆弄。据我所知,重新启动TKinter应用程序的唯一方法是在线程中运行它然后杀死并重新启动该线程。我建议你看一下Python的multiprocessing或threading模块。
你可以尝试的东西(在过去对我有用,但我认为这不是真正的正确方法)是将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