2016-02-05 104 views
1

我目前正在为用户界面使用tkinter的战舰游戏项目(用于学习目的),并且因为我希望此程序能够在两台计算机上为多人游戏运行,为数据传输。这是我第一次使用扭曲,但我已经多次使用tkinter。用Tkinter扭曲的线程

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

但是,我试图从twisted.internet导入tksupport,但它表示它不存在。我在我的网站包中检查了我的扭曲文件夹以确保它确实不存在,但即使是扭曲的文档也声称它是。我假设这是因为我正在运行python 3.5和tksupport还没有移植过,但如果情况并非如此,请让我知道。另外,关于带螺纹的解决方案,我发现在将螺纹反应器放入其自己的螺纹中存在一些争议。 可以把reactor放在它自己的线程中,如果有的话,我应该采取哪些预防措施?

谢谢。

+0

据我的记忆,战舰是一款回合制游戏,它是好的,冻结一个玩家屏幕,而等待来自另一方的消息。如果是这样,我会考虑使用套接字来避免异步消息的复杂性。 –

+0

@TerryJanReedy是的,但正如我所说,这是用于学习的目的。基本上,我*故意*使其变得更加复杂,因此我可以学习如何使用扭曲。但我也尝试使用扭曲来实现游戏中的聊天。基本上我计划有两个听众,一个用于聊天,另一个用于游戏数据。虽然你认为游戏数据是正确的,但可以使用简单的同步套接字,但聊天需要异步。 – RobertR

回答

1

我看了看源代码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()". 
+0

因此,这只是使用tkinter 3.x兼容导入的扭曲'tksupport'的相同实现? – RobertR

+0

@RobertR是的,正好。 – cpburnz