Python: как создать отдельный модуль для класса GUI - PullRequest
0 голосов
/ 14 сентября 2018

Этот код работает нормально. MyApp - это класс, выполняющий всю работу, а MyGUI - это пользовательский интерфейс, отображающий и запрашивающий данные из MyApp.

class MyGUI(): # displays results from MyApp and sends request to MyApp (e.g. fetch prices new prices)

    def __init__(self):
        print("GUI running")

    def user_request_price(self,ticker):        
        self.req_price(ticker)

    # methods I request from MyApp 
    def req_price(self,ticker): 
        app.get_price(ticker)

    # methods I receive from MyApp
    def print_price(self,val,price):
        print (val,":",price)    

class MyApp(): # does a lot of stuff, e.g. fetch prices from a server

    def __init__(self):
        self.id = 0
        self.gui = MyGUI() # start gui

    # methods called by GUI
    def get_price(self, ticker):
        if ticker == "MSFT": price = 20.23
        self.output_price(ticker,price)

    # methods sent to GUI
    def output_price(self,ticker,price):
        self.gui.print_price(ticker,price)


if __name__ == "__main__": 
    app = MyApp()
    app.gui.user_request_price("MSFT")

Теперь я хочу поместить графический интерфейс в отдельный модуль, поэтому создайте файл модуля gui.py и импортируйте его в файл MyApp:

from gui import *

и все. Где я борюсь: как выглядит gui.py и как MyGUI () может получить доступ к методам MyApp? Разумно ли делать это разделение? Любые другие предложения по структурированию?

Ответы [ 3 ]

0 голосов
/ 14 сентября 2018

в вашем gui.py

from myapp import MyApp

class MyGUI(): # displays results from MyApp and sends request to MyApp (e.g. fetch prices new prices)

    app = MyApp()

    def __init__(self):
        print("GUI running")

    def user_request_price(self,ticker):        
        self.req_price(ticker)

    # methods I request from MyApp 
    def req_price(self,ticker): 
        app.get_price(ticker)

    # methods I receive from MyApp
    def print_price(self,val,price):
        print (val,":",price)  

И в вашем myapp.py (обратите внимание на первую строку), и убедитесь, что оба файла находятся в одном каталоге, иначе вы должны изменить свой импорт относительно.

from gui import MyGUI

class MyApp(): # does a lot of stuff, e.g. fetch prices from a server

    def __init__(self):
        self.id = 0
        self.gui = MyGUI() # start gui

    # methods called by GUI
    def get_price(self, ticker):
        if ticker == "MSFT": price = 20.23
        self.output_price(ticker,price)

    # methods sent to GUI
    def output_price(self,ticker,price):
        self.gui.print_price(ticker,price)

if __name__ == "__main__": 
    app = MyApp()
    app.gui.user_request_price("MSFT")
0 голосов
/ 17 сентября 2018

Наконец-то я это сделал - кажется, лучший подход для четкого разделения и связи между приложением и графическим интерфейсом.

Gui:

import queue

def __init__(self):
    threading.Thread.__init__(self)
    self.requests = queue.Queue()  # request queue for App
    self.start()

def queue_request(self,reqId,val):
    self.requests.put([reqId,val])

APP:

import threading
import queue

def checkGUIQueue(self):
    threading.Timer(1.0, self.checkGUIQueue).start() # check every 1 second                
    while not self.gui.requests.empty():
        (id,value) = self.gui.requests.get()
        ... process request ...
0 голосов
/ 14 сентября 2018

Файл gui.py будет просто

class MyGUI(): # displays results from MyApp and sends request to MyApp (e.g. fetch prices new prices)

def __init__(self):
    print("GUI running")

def user_request_price(self,ticker):        
    self.req_price(ticker)

# methods I request from MyApp 
def req_price(self,ticker): 
    app.get_price(ticker)

# methods I receive from MyApp
def print_price(self,val,price):
    print (val,":",price) 

Добавьте импорт в начало myapp.py, и все должно работать нормально.

Я пытаюсь разделить мой код на отдельные файлы, если это имеет смысл. Это делает чтение вещей намного понятнее.

...