如何在 Python 中构造 GUI 事件处理程序

How to structure GUI event handler in Python

我在以不创建循环导入的方式设计我的代码时遇到了问题。

我有一个事件处理程序文件,如下所示:

import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk
import gui

class Gui_Event_Handler:
    def exit(self, *args):
        Gtk.main_quit()
    
    def drawmap(self, viewport, args):
        gui.draw_map()

同时,我在我的 GUI 文件中创建了一个 class 的对象来连接信号。

from gui_event_handler import Gui_Event_Handler

glade_file = "gui.glade"
builder = Gtk.Builder()
builder.add_from_file(glade_file)
builder.connect_signals(Gui_Event_Handler())

viewport = builder.get_object("view")

default_lat, default_lon = config.get_config("default loc")
current_lat, current_lon = get_coordinates()
zoom = int(config.get_config("default zoom"))
figure = get_figure(default_lat, default_lon, zoom)

viewport.add(FigureCanvas(figure))

window = builder.get_object("main_window")
window.show_all()
Gtk.main()

def draw_map():
    print("test")

当然,这会产生一个错误,指出模块由于循环导入而部分初始化。

在查看了关于避免循环导入的各种 Stack Overflow 帖子后,我尝试使用

import gui_event_handler

这没有解决循环导入的问题,即使解决了,也无助于我创建的糟糕设计。

我曾尝试让 GUI 模块使用一个对象,并让 main/imports 文件同时运行这两者。他们都没有解决这个问题。我做打印语句的绘制地图方法会调用视口的绘制方法来更新它(我认为这是正确的方法,我还在学习Gtk),我只是有打印来测试没有的结构'没用。

我知道问题是我有两个相互调用 methods/classes 的文件,但根据我目前对 Python 的了解,我不知道如何构建所有内容。

如何重新组织我的方法和项目,以便我可以通过方法调用更新我的 GUI?

您可以将 draw_map() 函数放在一个单独的文件中并导入它而不是“gui”。如果你不想这样做,你也应该能够在“gui”中为 draw_map() 创建一个 class,如下所示:

class draw:
    def draw_map():
        print("test")

并在 Gui_Event_Handler

中创建一个实例
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk
import gui

class Gui_Event_Handler:
    def __init__(self):
        self.draw = gui.draw() 

    def exit(self, *args):
        Gtk.main_quit()
    
    def drawmap(self, viewport, args):
        self.draw.draw_map()

我能够对类似问题进行更多研究,并找到了一个解决方案,为我实现目标提供了足够的指导。

我最终做的是将 Gui_Event_Handler class 移动到与其余 GUI 函数相同的文件中,但低于定义的函数。

我之前有 gui.py 和 gui_event_handler.py,现在只有 gui.py,如下所示:

import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk

builder = Gtk.Builder()

def drawmap():
    #draw the map

def exit():
    #exit the app

class Gui_Event_Handler:

     def exit(self, *args):
          exit()

     def drawmap(self, *args):
          drawmap()

builder.connect_signals(Gui_Event_Handler())
Gtk.main()

Gui_Event_Handler 中的方法对应于配置为由 Glade 中的各种信号调用的方法。