我看了看源代码twisted.internet.tksupport,它似乎还没有被移植到支持Python 3的罪魁祸首是导入Tkinter的模块行:
import tkSimpleDialog, tkMessageBox
在Python 3相当于将是:
from tkinter import simpledialog, messagebox
为了解决这个问题,直到扭曲支持的Tkinter的Python 3,你应该能够创建自己的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"]
而继扭曲的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()".
据我的记忆,战舰是一款回合制游戏,它是好的,冻结一个玩家屏幕,而等待来自另一方的消息。如果是这样,我会考虑使用套接字来避免异步消息的复杂性。 –
@TerryJanReedy是的,但正如我所说,这是用于学习的目的。基本上,我*故意*使其变得更加复杂,因此我可以学习如何使用扭曲。但我也尝试使用扭曲来实现游戏中的聊天。基本上我计划有两个听众,一个用于聊天,另一个用于游戏数据。虽然你认为游戏数据是正确的,但可以使用简单的同步套接字,但聊天需要异步。 – RobertR