如何通过单击按钮重新启动 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()
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()