Tkinter事件循环问题

在TK时,是否可以将消息发送到GUI实例
事件循环正在运行?我的意思是创建像GUI对象之后
root = tk()
mygui = someui(root)
并打电话
root.mainloop()
我可以在不退出UI或关闭的情况下向MyGui发送消息
窗口?我尝试了一些代码
mygui.someThod()
但是它只有在我关闭UI窗口后才被执行.
GUI运行时获取此消息传递的方法?
(原谅我,这是一个重复的问题..但是我有点绝望)
谢谢
戈登

# 回答1


戈登写道:
这是使TKINTER运行的事件循环,然后TKINTER调用
您的程序(通常是通过命令回调或事件处理程序)
是时候做某事了.
所以我想这里的问题是您期望的
方法,以及您期望tkinter在调用它时会做什么...
# 回答2


在文章
fredrik lundh
# 回答3


8月27日,晚上10:42,Fredrik Lundh 谢谢回复
我打算写一个控制器(如在MVC中),以实例化
GUI类并显示UI.GUI将将用户输入发送回到
控制器又将对其进行处理并将结果发送到GUI
显示
就像是
controllermodule.py
----------------------------
班级控制器:
def creategui(self):
root = tk()
self.mygui = uimodule.mygui(root)
root.mainloop()
def sendmessagetoui(self):
self.mygui.displayresult(SomereSultValue)
我不知道这是否是正确的方法.
SendMessage()它试图在GUI实例上调用DisplayResult()
它已经在事件loop.displayresult()中仅被调用
事件循环完成后(当我关闭GUI窗口时).
有没有办法保持GUI窗口打开并拥有控制器
将消息发送到GUI实例,以便我可以通过处理
GUI实例的结果值?
谢谢
戈登
# 回答4


在文章中
,
gordon 谢谢回复
我打算写一个控制器(如在MVC中),以实例化
GUI类并显示UI.GUI将将用户输入发送回到
控制器又将对其进行处理并将结果发送到GUI
显示
就像是
controllermodule.py
----------------------------
班级控制器:
def creategui(self):
root = tk()
self.mygui = uimodule.mygui(root)
root.mainloop()
def sendmessagetoui(self):
self.mygui.displayresult(SomereSultValue)
我不知道这是否是正确的方法.
SendMessage()它试图在GUI实例上调用DisplayResult()
它已经在事件loop.displayresult()中仅被调用
事件循环完成后(当我关闭GUI窗口时).
有没有办法保持GUI窗口打开并拥有控制器
向GUI实例发送消息,所以 我可以通过处理的
GUI实例的结果值?
通常,MVC在一个具有一个事件循环的一个应用程序中适用.那么你
设置您的GUI,然后开始活动循环. GUI将处理用户
事件(例如,键入文本,按按钮,选择菜单)为
回调可以执行诸如创建控制器对象并执行的事情
它们上的方法.
因此,对于初学者,您的控制器对象不应创建根,也不应
它致电Mainloop启动事件循环.这两个行动应该是
通过启动您的应用程序的主脚本完成了一次.
至于从这里去哪里...这将有助于更多地了解您
正在尝试做.
- 罗素
# 回答5


8月29日,上午4:45," Russell E. Owen" 伙计们
感谢您的有用回复..我按照您的建议重写代码.它
从主脚本创建一个控制器对象和GUI对象.
我必须在代码中链接一些方法.
想知道是否可以以某种方式避免这种情况.
这是序列
1.用户在Textfield中输入一些价值,然后单击OkButton
2. ON OKBUTTONCLICK,GUI采用用户input值并退出
eventloop.it然后调用控制器并通过UserInputValue.
3.控制器进行一些计算(我有一个外部程序
进行计算,但是为简单起见,我只是在里面写了一种方法
控制器)带有给定值,获得结果并调用GUI的
更新isplay(),传递结果值.
4. GUI在画布上创建结果.
被称为恢复事件循环
用户再次在文本字段中输入一些值,然后单击OkButton ...
我通过单击quitbutton来退出应用程序
顶级窗口.
我通过在文本字段中输入一些价值来尝试我的应用程序,然后
单击okbutton,计算出的结果显示在画布上.我做
这个过程说3次..然后我单击"退出"按钮和窗口
关闭.
我已经在GUI的UpdatedIsplay()方法中放了一个打印语句
在由parent.mainloop()恢复事件循环之后.此打印
语句与我单击的次数一样多次
确定按钮(在这种情况下为3次).这是由于清除
堆栈?
我觉得这不是一个好的设计..如果有人,我会很感激
会告诉我如何改善它.
避免通话?
这就是我重组代码的方式
modulea.py
---------------
导入模块
从tkinter导入TK
类MyController(对象):
def __init __(自我):
打印"控制器()"
def验证选择(self,userInputval):
if(userInputval 50或userInputVal == 0):
UserInputVal = 50
self.dosomecalcalulation(userInputVal)
def dosomecalculation(self,userInputval):
resultvalue = 2*userInputval +10
self.updateresults(结果值)
DEF UPDATERESULTS(self,resultvalue):
self.myapp.updatedisplay(结果值);
如果__name__ ==" __ -main __":
控制器= mycontroller()
root = tk()
root.wm_title(" myuiapp")
controller.myapp = moduleb.myui(root,Controller)
root.mainloop()
modu leb.py
---------------
从tkinter导入 *
类myui(对象):
def __init __(自我,父,控制器):
self.myparent = parent
self.mainframe = frame(父,背景="灰色")
self.mainframe.pack(fill =两者兼而有之,展开=是)
self.controller =控制器
....添加了一个画布,好的,退出按钮
def okbtnclick(self):
打印" OKBTNCLICKED"
self.okbutton.configure(状态=禁用)
userInputValue = self.getUserInputValue()
self.myparent.quit()#quits事件循环
self.controller.validateselection(userInputValue)
def quitbtnClick(self):
打印"退出BTN单击"
self.myparent.destroy()
DEF UPDIDESPLAY(SELF,RESSERVALUE):
消息='结果为='+str(resultvalue)
self.canvresult.delete(all)
self.canvresult.create_text(1,40,锚= w,text =消息,
宽度= 280)
self.okbutton.configure(状态=正常)
self.myparent.mainloop()#恢复事件循环
打印'in UpdatedIsplay():称为Mainloop'
谢谢
戈登
# 回答6


在文章中
<75 **********************************************@b30g2000prf. GoogleGroups.com>,
gordon 伙计们
感谢您的有用回复..我按照您的建议重写代码.它
从主脚本创建一个控制器对象和GUI对象.
我必须在代码中链接一些方法.
想知道是否可以以某种方式避免这种情况.
这是序列
1.用户在Textfield中输入一些价值,然后单击OkButton
2. ON OKBUTTONCLICK,GUI采用用户input值并退出
eventloop.it然后调用控制器并通过UserInputValue.
3.控制器进行一些计算(我有一个外部程序
进行计算,但是为简单起见,我只是在里面写了一种方法
控制器)带有给定值,获得结果并调用GUI的
更新isplay(),传递结果值.
4. GUI在画布上创建结果.
被称为恢复事件循环
用户再次在文本字段中输入一些值,然后单击OkButton ...
我通过单击quitbutton来退出应用程序
顶级窗口.
我通过在文本字段中输入一些价值来尝试我的应用程序,然后
单击okbutton,计算出的结果显示在画布上.我做
这个过程说3次..然后我单击"退出"按钮和窗口
关闭.
我已经在GUI的UpdatedIsplay()方法中放了一个打印语句
在由parent.mainloop()恢复事件循环之后.此打印
语句与我单击的次数一样多次
确定按钮(在这种情况下为3次).这是由于清除
堆栈?
我觉得这不是一个好的设计..如果有人,我会很感激
会告诉我如何改善它.
避免通话?
这就是我重组代码的方式
你为什么要循环?只要让它运行.
按下按钮验证输入,执行计算
并显示结果,所有这些都不离开事件循环.
如果您的计算非常慢,那么您还有其他问题要处理
(特别是背景线程无法安全地与TKINTER进行交谈,但是您
可以 用背景线程计算内容,并从 主线程). 但是后来越过那座桥. - 罗素
# 回答7

8月29日,晚上10:46," Russell E. Owen"

标签: python

添加新评论