如何将主程序与GUI“合并”?

2024-05-15 22:18:53 发布

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

为了明确区分我的问题和这里的许多其他问题:

我已经编写了“main”程序(类似于类、函数和变量)和一大块GUI

因此,这不是一个关于如何用tkinter或python编写的问题,更重要的是如何将它们结合起来

我应该从GUI运行程序吗?以及各种变量、函数和类?如果是这样的话,我是否应该在需要时将整个主程序使用到每个项目

我是否应该创建第三个程序来导入GUI的主

我似乎找不到任何明确的答案,或者至少我似乎找不到如何表达这个问题,因为所有的搜索结果都指向如何编写GUI,我已经了解了GUI的要点


Tags: 项目函数答案程序maintkintergui区分
1条回答
网友
1楼 · 发布于 2024-05-15 22:18:53

下面是我为我的一个项目所做的结构示例,其中包含一个服务器(您实际的主代码)、一个GUI和第三个我称为“App”的程序,该程序只运行2。我创建了link_with_guilink_with_server等函数,这样您就可以从服务器访问GUI变量,反之亦然

要运行这个程序,只需调用python app.py。我在服务器和GUI中添加了if __name__ == '__main__'部分,因此您可以独立运行它们(用于测试目的)

编辑:我用线程更新了代码。在服务器中,有一个无限循环,它每秒递增变量self.count,如果在GUI中单击按钮,它将打印此计数

应用程序:

# app.py
from server import Server
from gui import GUI

class App:
    def __init__(self):
        self.gui = GUI()
        self.server = Server()
        self.link_parts()

    def link_parts(self):
        self.server.link_with_gui(self.gui)
        self.gui.link_with_server(self.server)

def main():
    app = App()
    app.gui.mainloop()

if __name__ == '__main__':
    main()

服务器:

# server.py
import threading
import time

class Server:
    def __init__(self):
        self.count = 0
        thread = threading.Thread(target=self.counter)
        thread.daemon = True
        thread.start()

    def link_with_gui(self, gui):
        self.gui = gui

    def display(self):
        self.gui.chat_text.delete("1.0", "end")
        self.gui.chat_text.insert("insert", "This is Server count : {}".format(self.count))

    def counter(self):
        while True:
            self.count += 1
            time.sleep(1)
            print("self.count", self.count)

if __name__ == '__main__':
    server = Server()
    time.sleep(4)

图形用户界面:

# gui.py
import tkinter as tk
class GUI(tk.Tk): # Graphic User Interface
    def __init__(self):
        super().__init__()
        self.btn = tk.Button(master=self, text="Click Me")
        self.btn.pack()

        self.chat_text = tk.Text(self, width=20, height=3)
        self.chat_text.pack()

    def link_with_server(self, server):
        self.server = server
        self.btn.configure(command=self.server.display)

if __name__ == '__main__':
    gui = GUI()
    gui.mainloop()

相关问题 更多 >