【问题标题】:How to structure GUI event handler in Python如何在 Python 中构建 GUI 事件处理程序
【发布时间】:2021-10-30 20:37:36
【问题描述】:

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

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

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 文件中创建了该类的一个对象来连接信号。

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 文件。他们都没有解决这个问题。我做了一个print语句的draw map方法会调用viewport的draw方法来更新它(我认为这是正确的方法,我还在学习Gtk),我只有print来测试没有的结构没用。

我知道问题在于我有两个相互调用方法/类的文件,但以我目前对 Python 的了解,我不知道如何构建所有内容。

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

【问题讨论】:

  • 总是将完整的错误消息(从单词“Traceback”开始)作为文本(不是截图,不是链接到外部门户)有问题(不是评论)。还有其他有用的信息。
  • 你不应该 import gui 而是发送 gui 作为函数的参数 - def drawmap(...., gui) 或 classe Gui_Event_Handler(gui)。它需要__init__ in Gui_Event_Handler() 来获得Gui_Event_Handler(draw_map) 并分配给self.draw_map,然后使用self.draw_map() 而不是gui.draw_map()
  • 所以似乎建议是将 gui 作为类构造函数中的参数发送并使用它。我会试一试,看看它是否有效!

标签: python gtk


【解决方案1】:

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

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()

【讨论】:

    【解决方案2】:

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

    我最终为我想要实现的目标所做的工作是将 Gui_Event_Handler 类移动到与其他 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 中的各种信号调用的方法相对应。

    【讨论】:

      猜你喜欢
      • 2013-12-24
      • 2015-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-16
      • 2013-05-30
      • 2013-08-15
      • 1970-01-01
      相关资源
      最近更新 更多