用Tkinter扭曲线程

时间:2016-02-05 16:48:08

标签: python python-3.x tkinter twisted

我目前正在开发一个Battleship游戏项目(用于学习目的),它使用tkinter进行UI,因为我希望这个程序能够在两台计算机上运行多人游戏,扭曲数据传输。这是我第一次使用twisted,但是我多次使用tkinter。

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

但是,我尝试从tksupport导入twisted.internet,但它说它并不存在。我检查了我的网站包中的扭曲文件夹,以确定它确实不存在,但即使扭曲的文档声称它是。我假设这是因为我正在运行python 3.5并且tksupport还没有移植过,但如果不是这样,请告诉我。

另外,对于带螺纹的解决方案,我发现将扭曲的反应器放在它自己的线程中存在一些争议。 reactor放在自己的主题中是否可以,如果是,我应该采取什么预防措施?

感谢。

2 个答案:

答案 0 :(得分:1)

我看了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' s 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()".

答案 1 :(得分:0)

我目前已经扭曲了17.9.0和python 3.6。 参考上面的答案, tksupport for python 3现在可以使用twisted,因此无需创建自己的tksupport模块。