python - 单击按钮后如何在 tkinter 中仅打开 1 个新窗口?
问题描述
我参考了这篇文章Python tkinter: How can I ensure only ONE child window is created onclick 而不是每次单击按钮时都创建一个新窗口?但我无法让我的代码工作。有人可以帮我吗?
from tkinter import *
import os
import sys
import _thread
from s2 import work
from s1 import work2
root = Tk()
root.resizable(width=False, height=False)
root.title("Sample tkinter")
root.geometry(r"550x550")
def open_entry():
os.system("data1.py")
def open_aisle():
os.system("data2.py")
def close_entry():
os.system("data10.py")
def close_aisle():
os.system("data20.py")
def run():
_thread.start_new_thread(work,())
_thread.start_new_thread(work2,())
def openNewWindow():
global createdb_btn
newWindow = Toplevel(root)
newWindow.resizable(width=False,height=False)
newWindow.title("New Window")
newWindow.geometry("300x300")
create_front = Button(newWindow,text="Entry DB",relief=FLAT,bg="black",fg="white",command=open_entry)
create_front.place(x=50,y=80)
create_aisle = Button(newWindow,text="Aisle DB",relief=FLAT,bg="black",fg="white",command=open_aisle)
create_aisle.place(x=145,y=80)
def openAnotherWindow():
global removedb_btn
otherWindow = Toplevel(root)
otherWindow.resizable(width=False,height=False)
otherWindow.title("New Window")
otherWindow.geometry("300x300")
remove_front = Button(otherWindow,text="Entry DB",relief=FLAT,bg="black",fg="white",command=close_entry)
remove_front.place(x=50,y=80)
remove_aisle = Button(otherWindow,text="Aisle DB",relief=FLAT,bg="black",fg="white",command=close_aisle)
remove_aisle.place(x=145,y=80)
removedb_btn = Button(root,text="Remove databases",relief=FLAT,bg="black",fg="white",state=DISABLED)
removedb_btn.place(x=380,y=120)
camera_btn = Button(root,text="Open Cams",relief=FLAT,bg="black",fg="white",command=run)
camera_btn.place(x=50,y=120)
createdb_btn = Button(root,text="Create databases",relief=FLAT,bg="black",fg="white",command=openNewWindow)
createdb_btn.place(x=205,y=120)
removedb_btn = Button(root,text="Remove databases",relief=FLAT,bg="black",fg="white",command=openAnotherWindow)
removedb_btn.place(x=380,y=120)
root.mainloop()
我试图在 openNewWindow 函数和 openAnotherWindow 函数中实现这一点。
解决方案
这就是我所做的。改变了行:
createdb_btn = Button(root,text="Create databases",relief=FLAT,bg="black",fg="white")
createdb_btn.config(command=lambda b=createdb_btn: (openNewWindow(b), b.config(state='disabled')))
并添加
newWindow.protocol("WM_DELETE_WINDOW", lambda:(button.config(state='active'), newWindow.destroy()))
内部newWindow
函数,这样当您将创建窗口的按钮作为变量传递并在opennewWindows
函数覆盖时使用它来重新激活它之前newWindow.destroy()
推荐阅读
- jquery - 导出到 Excel 时将 jQGrid 数字转换为文本
- python - 使用远程服务器开发和调试 Python
- sql - 如果我们在连接查询中切换表的位置会增加加载数据的速度,这是真的吗?
- android - 针对 SMS 和 CALL_LOG 的 Google 权限限制
- c# - 在 WPF (MVVM) 中实现工作和服务单元
- java - 使用 jSSC 发送短信
- apache-spark - SparkSQL:如何在从数据库加载数据集时指定分区列
- visual-studio-code - 缩进:在vscode中只使用4个空格的缩进
- android - 什么是 libusc.so,为什么我会从那里崩溃?
- react-native - 如何在 React Native 中检测虚拟导航栏何时打开或关闭