gpt4 book ai didi

python - 使用 Tkinter 进行 Twisted 线程化

转载 作者:太空宇宙 更新时间:2023-11-03 16:58:31 25 4
gpt4 key购买 nike

我目前正在开发一个战舰游戏项目(出于学习目的),该项目使用 tkinter 作为 UI,并且因为我希望该程序能够在两台计算机上运行以进行多人游戏,所以扭曲了数据传输。这是我第一次使用twisted,但是我已经使用过tkinter很多次了。

我知道twisted和tkinter都在循环中运行,所以通常不可能让它们在同一个线程中运行。所以我发现有两种方法可以解决这个问题:tksupport 和在单独的线程中运行twisted 的reactor

但是,我尝试从 twisted.internet 导入 tksupport 但它说它不存在。我检查了我的站点包中的扭曲文件夹,以确保它确实不在那里,但即使扭曲的文档也声称它存在。我假设这是因为我运行的是 python 3.5 并且 tksupport 尚未移植,但如果情况并非如此,请告诉我。

另外,对于线程的解决方案,我发现将twisted的 react 堆放在它自己的线程中存在一些争议。 可以将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()".

关于python - 使用 Tkinter 进行 Twisted 线程化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35229352/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com