我的小弟弟正在进入编程,而在他的科学博览会项目中,他正在模拟天空中的一群鸟.他已经完成了大部分代码编写工作,并且工作得很好,但是鸟类需要每时每刻都在移动.
然而,Tkinter占用了自己的事件循环的时间,所以他的代码不会运行.做root.mainloop()运行,运行和继续运行,它运行的唯一事情是事件处理程序.
有没有办法让他的代码与mainloop一起运行(没有多线程,这很混乱,这应该保持简单),如果是这样,它是什么?
现在,他想出了一个丑陋的黑客,把他的move()功能绑在一起<b1-motion>,所以只要他按住按钮并摆动鼠标,就可以了.但必须有一个更好的方法.
我创建了一个窗口:
root = Tk()
Run Code Online (Sandbox Code Playgroud)
并删除标题栏:
root.overrideredirect(True)
Run Code Online (Sandbox Code Playgroud)
现在窗口不在Windows的任务栏上.如何在任务栏中显示它?(如果其他窗户在我的上面,我只想把窗户拉到前面)
我正在编写一个'向导'类型的Python Tkinter GUI,它从用户收集信息,然后根据用户的条目执行多个操作:文件复制,数据库更新等.处理通常需要30-60秒,在此期间,我想要:
我开始将文本更新显示在子窗口中,该子窗口被配置为trainsient并wait_window用于暂停主循环直到活动完成.这适用于我创建的其他自定义对话框,它们具有调用窗口destroy方法的OK/cancel按钮.基本方法是:
def myCustomDialog(parent,*args):
winCDLG = _cdlgWin(parent,*args)
winCDLG.showWin()
winCDLG.dlgWin.focus_set()
winCDLG.dlgWin.grab_set()
winCDLG.dlgWin.transient(parent)
winCDLG.dlgWin.wait_window(winCDLG.dlgWin)
return winCDLG.userResponse
class _cdlgWin():
def __init__(self,parent,*args):
self.parent = parent
self.dlgWin = tk.Toplevel()
self.userResponse = ''
def showWin(self):
#Tkinter widgets and geometry defined here
def _btnOKClick(self):
#self.userResponse assigned from user entry/entries on dialog
self.dlgWin.destroy()
def _btnCancelClick(self):
self.dlgWin.destroy()
Run Code Online (Sandbox Code Playgroud)
但是,这种方法不适用于我想要创建的新监视器和更新对话框.
首先,因为没有用户启动的操作来触发复制/更新活动然后destroy,我必须将它们放在showWin或其他方法中.我已经尝试了两种方式但是我遇到了竞争条件(代码完成了复制/更新的东西,但之后尝试在它之前销毁窗口),并且从不执行复制/更新的东西,因为它点击wait_window之前我可以激活其他方法.
如果我能找到一种方法,那么次要问题(防止用户在工作完成之前关闭子窗口)将在下面的答案中介绍.
那么......有什么样的绑带可以申请让这种方法按我想要的方式工作吗?或者我需要废弃它,因为它无法正常工作?(如果是后者,有什么方法可以实现最初的目标吗?)