有没有办法将tkinter GUI包装在一个可以创建并与另一个对象交互的类中? (*没有*挂在主循环中)

时间:2011-04-05 03:55:13

标签: python tkinter

有没有办法将tkinter GUI包装在一个可以从另一个对象创建和交互的类中?为了真正有用,该类必须工作,因此mainloop或其等价物不能保存应用程序。如果是这样,有人能指出我一个有效的例子吗?

对于上下文,我要做的是创建一个SimpleUI类,我可以在任何应用程序中使用它来显示信息或注册要在按钮或按键上执行的函数。所以任何线程,队列等我都希望隐藏在SimpleUI类中。

根据我从阅读中收集到的内容,如果不重新实现mainloop,答案就是“否”。相反,GUI应该是通过一种方法或另一种方法来分配工作的主要应用程序。但是,这会使任何使用tkinter的应用程序(也许还有其他的GUI?)感觉尾巴正在摇尾巴。希望我误解了我的阅读内容。

我知道这可能看起来像this和其他类似问题的转贴,但我无法对这些问题发表评论,答案似乎与我想做的事情正好相反。除了那个问题,我在很多地方找到了相关代码的点点滴滴,但是我还没把它们放在一起。如果有办法,我将学习Python线程或任何使其工作的东西。

如果它有任何不同,我正在使用Python 3.1。

我希望它如何工作的示例。

ui = SimpleUI()
ui.hide()
ui.show()
ui.add_frame...
ui.add_button...
ui.register_function(button, function)

1 个答案:

答案 0 :(得分:1)

这是你要找的吗?

#The threading module allows you to subclass it's thread class to create
#and run a thread, in this case we will be starting SimpleUI in a seperate thread

import threading
from Tkinter import *

def printfunction():
    print "ButtonPress"

class NewClass:
    def __init__(self):
        self.ui = SimpleUI()
        self.ui.add_frame("frame1")
        self.ui.add_button("button1","frame1")
        self.ui.register_function("button1",printfunction)
        self.ui.start()
        #self.ui = Threader().start()
    def PrintSuccess(self):
        print "Success!"

class SimpleUI:
    def __init__(self):
        self.root = Tk()
        self.frames = {}
        self.buttons = {}
    def start(gui):
        class Threader(threading.Thread):
            def run(self):
                gui.root.mainloop()
        Threader().start()
    def hide(self):
        self.root.withdraw()
        if(raw_input("press enter to show GUI: ")==""):self.show()
    def show(self):
        self.root.update()
        self.root.deiconify()
    def add_frame(self,name):
        tmp = Frame(self.root)
        tmp.pack()
        self.frames[name] = tmp
    def add_button(self,name,frame):
        tmp = Button(self.frames[frame])
        tmp.pack()
        self.buttons[name] = tmp
    def register_function(self,button,function):
        self.buttons[button].config(command=function)


NC = NewClass()
NC.PrintSuccess()