使用 Tkinter 使用 Twisted 进行线程化
Threading with Twisted with Tkinter
我目前正在开发一个 Battleship 游戏项目(出于学习目的),该项目使用 tkinter 作为 UI 并且,因为我希望该程序能够 运行 在两台计算机上进行多人游戏, 扭曲数据传输。这是我第一次使用 twisted 但是我已经使用 tkinter 很多次了。
我知道循环中的 twisted 和 tkinter 运行 所以通常不可能将这些 运行ning 放在同一个线程中。所以我发现有两种方法可以解决这个问题:tksupport
和 运行ning 扭曲的 reactor
在一个单独的线程中。
但是,我尝试从twisted.internet
导入tksupport
,但它说它不存在。我检查了我的站点包中的扭曲文件夹以确保它确实不存在,但即使是扭曲的文档也声称它存在。我假设这是因为我 运行ning python 3.5 和 tksupport
还没有移植过来,但如果不是这种情况,请告诉我。
此外,关于线程的解决方案,我发现将 twisted 的反应堆放在它自己的线程中存在一些争议。 是否可以将 reactor
放在自己的线程中,如果可以,我应该采取哪些预防措施?
谢谢。
我查看了 twisted.internet.tksupport 的源代码,它似乎没有被移植以支持 Python 3. 罪魁祸首是导入 tkinter 模块的行:
import tkSimpleDialog, tkMessageBox
在 Python 3 中相当于:
from tkinter import simpledialog, messagebox
为了在 Twisted 支持 Python 3 的 Tkinter 之前解决这个问题,您应该能够创建自己的 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()".
我目前已经扭曲了17.9.0和python3.6。
参考上面的答案,
python 3 的 tksupport 现在可用于 twisted,因此无需创建您自己的 tksupport 模块。
我目前正在开发一个 Battleship 游戏项目(出于学习目的),该项目使用 tkinter 作为 UI 并且,因为我希望该程序能够 运行 在两台计算机上进行多人游戏, 扭曲数据传输。这是我第一次使用 twisted 但是我已经使用 tkinter 很多次了。
我知道循环中的 twisted 和 tkinter 运行 所以通常不可能将这些 运行ning 放在同一个线程中。所以我发现有两种方法可以解决这个问题:tksupport
和 运行ning 扭曲的 reactor
在一个单独的线程中。
但是,我尝试从twisted.internet
导入tksupport
,但它说它不存在。我检查了我的站点包中的扭曲文件夹以确保它确实不存在,但即使是扭曲的文档也声称它存在。我假设这是因为我 运行ning python 3.5 和 tksupport
还没有移植过来,但如果不是这种情况,请告诉我。
此外,关于线程的解决方案,我发现将 twisted 的反应堆放在它自己的线程中存在一些争议。 是否可以将 reactor
放在自己的线程中,如果可以,我应该采取哪些预防措施?
谢谢。
我查看了 twisted.internet.tksupport 的源代码,它似乎没有被移植以支持 Python 3. 罪魁祸首是导入 tkinter 模块的行:
import tkSimpleDialog, tkMessageBox
在 Python 3 中相当于:
from tkinter import simpledialog, messagebox
为了在 Twisted 支持 Python 3 的 Tkinter 之前解决这个问题,您应该能够创建自己的 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()".
我目前已经扭曲了17.9.0和python3.6。 参考上面的答案, python 3 的 tksupport 现在可用于 twisted,因此无需创建您自己的 tksupport 模块。