Есть ли способ обернуть графический интерфейс tkinter в класс, который может быть создан и взаимодействовать с другим объектом?(* без * висит в основном цикле) - PullRequest
0 голосов
/ 05 апреля 2011

Есть ли способ обернуть графический интерфейс tkinter в класс, который может быть создан и взаимодействовать с другим объектом? Чтобы это было действительно полезно, класс должен работать так, чтобы mainloop или его эквивалент не содержали приложение. Если так, может кто-нибудь указать мне на рабочий пример?

Для контекста я пытаюсь создать класс SimpleUI, который я могу использовать в любом приложении, чтобы позволить ему отображать информацию или регистрировать функции, выполняемые при нажатии кнопок или клавиш. Поэтому любые потоки, очереди и т. Д. Я бы хотел скрыть в классе SimpleUI.

Исходя из того, что я собрал после прочтения, ответ - Нет, без повторной реализации mainloop Скорее, GUI должен быть основным приложением, которое обрабатывает работу тем или иным методом. Тем не менее, это может привести к тому, что любое приложение с tkinter (возможно, также с другими графическими интерфейсами?) Почувствует, что хвост виляет собакой. Надеюсь, я неправильно понял, что я читаю.

Я знаю, что это может показаться повторением этого и других подобных вопросов, но я не могу комментировать эти вопросы, и ответы, кажется, делают противоположное тому, что я хочу сделать. В дополнение к этому вопросу я нашел фрагменты связанного кода во многих местах, но я не смог собрать их вместе. Если есть способ, я изучу потоки Python или что-то еще, чтобы он работал.

Я использую Python 3.1, если это имеет какое-либо значение.

Пример того, как бы я хотел, чтобы это работало.

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

1 Ответ

1 голос
/ 07 апреля 2011

Это то, что вы ищете?

#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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...