在pygtk应用程序上运行原始输入

2024-03-29 12:07:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要制作一个从控制台读取数据的图形应用程序来更新一些小部件,这需要两个线程,一个用于GUI,一个用于控制台。问题是原始输入函数不起作用,并且会冻结应用程序。这是密码。你知道吗

import pygtk
pygtk.require('2.0')
import gtk
import gobject
from time import sleep
import sys
import threading

class Worker (threading.Thread):
    def __init__(self, app):
        threading.Thread.__init__(self)
        self.app = app

    def run(self):
        text = raw_input("Enter some text: ") #It freezes the application
        #text = "Hola" #It Works
        self.app.writeMessage(text, False)

class Application:
    def __init__(self, title, xPos, yPos):
        gtk.threads_init()
        self.win = gtk.Window()
        screen = self.win.get_screen()
        screenW = screen.get_width()
        screenH = screen.get_height()
        windowW = int(screenW * 0.5)
        windowH = int(screenH * 0.25)
        if type(xPos) is float:
            xPos = int(screenW * xPos)
        if type(yPos) is float:
            yPos = int(screenH * yPos)

        self.messageArea = gtk.TextView()
        self.scroll = gtk.ScrolledWindow()
        self.scroll.add(self.messageArea)
        self.win.set_size_request(windowW, windowH)
        self.win.set_title(title)
        self.win.add(self.scroll)
        self.win.show_all()
        self.win.move(xPos, yPos)
        self.win.connect("destroy", gtk.mainquit)


    def doOperation(self, function, *args, **kw):
        def idle_func():
            try:
                gtk.threads_enter()
                function(*args, **kw)
                return False
            finally:
                gtk.threads_leave()
        gobject.idle_add(idle_func)

    def sleeper():
        time.sleep(.001)
        return 1 # don't forget this otherwise the timeout will be removed

    def mainloop(self):
        #Trick for running threads and pygtk on win32 enviroment
        if sys.platform == 'win32':
            gtk.timeout_add(400, self.sleeper)
        gtk.threads_enter()
        gtk.mainloop()
        gtk.threads_leave()


    def writeMessage(self, message, isMainThread):
        if isMainThread:
            buf = self.messageArea.get_buffer()
            end_iter = buf.get_end_iter()
            buf.insert(end_iter, message)
        else:           
            self.doOperation(self.writeMessage, message, True)


if __name__ == "__main__":
    app = Application("Hello", 0, 0)
    worker = Worker(app)
    app.doOperation(worker.start)
    app.mainloop()

奇怪的是,只有在EclipsePydev中运行代码时,代码才能工作,但这不是我的意图,我必须从控制台运行它。这就是问题所在,如何在不同的线程上执行原始输入函数和GUI?你知道吗


Tags: textimportselfappgtkgetifinit