用Tkinter加捻穿线
问题描述
我目前正在做一个战舰游戏项目(用于学习目的),它使用tkinter作为用户界面,因为我希望这个程序能够在两台计算机上运行多人,扭曲的数据传输。这是我第一次使用Twisted,但我已经多次使用tkinter了。
我知道twted和tkinter都在循环中运行,所以通常不可能让它们在同一个线程中运行。因此,我发现有两种方法可以解决此问题:tksupport
和在单独的线程中运行Twsted的reactor
。
twisted.internet
导入tksupport
,但它说它不存在。我在我的网站-Packages中检查了一下我的扭曲文件夹,它确实不在那里,但即使是扭曲的文档也声称它在那里。我假设这是因为我运行的是python3.5,tksupport
还没有移植过来,但如果不是这样,请让我知道。
此外,至于线程的解决方案,我发现在将TWSTED的反应堆放在它自己的线程中存在一些争议。是否可以将reactor
放在它自己的线程中,如果可以,我应该采取什么预防措施?
谢谢。
解决方案
我查看了twisted.internet.tksupport的源代码,它似乎没有移植到支持Python3。罪魁祸首是导入tkinter模块的行:
import tkSimpleDialog, tkMessageBox
在Python3中,等效项为:
from tkinter import simpledialog, messagebox
要在Twisted Support Tkinter for Python3之前解决此问题,您应该能够创建自己的tksupport模块:
# tksupport.py
from tkinter import simpledialog, messagebox
from twisted.internet import task
_task = None
def install(widget, ms=10, reactor=None):
"""Install a Tkinter.Tk() object into the reactor."""
installTkFunctions()
global _task
_task = task.LoopingCall(widget.update)
_task.start(ms / 1000.0, False)
def uninstall():
"""Remove the root Tk widget from the reactor.
Call this before destroy()ing the root widget.
"""
global _task
_task.stop()
_task = None
def installTkFunctions():
import twisted.python.util
twisted.python.util.getPassword = getPassword
def getPassword(prompt = '', confirm = 0):
while 1:
try1 = simpledialog.askstring('Password Dialog', prompt, show='*')
if not confirm:
return try1
try2 = simpledialog.askstring('Password Dialog', 'Confirm Password', show='*')
if try1 == try2:
return try1
else:
messagebox.showerror('Password Mismatch', 'Passwords did not match, starting over')
__all__ = ["install", "uninstall"]
并遵循Twisted的Tkinter example稍作修改的版本,您将这样做:
import tkinter as tk
from twisted.internet import reactor
import tksupport
root = tk.Tk()
# Install the Reactor support
tksupport.install(root)
# at this point build Tk app as usual using the root object,
# and start the program with "reactor.run()", and stop it
# with "reactor.stop()".
相关文章