【发布时间】: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)或 classeGui_Event_Handler(gui)。它需要__init__inGui_Event_Handler()来获得Gui_Event_Handler(draw_map)并分配给self.draw_map,然后使用self.draw_map()而不是gui.draw_map() -
所以似乎建议是将 gui 作为类构造函数中的参数发送并使用它。我会试一试,看看它是否有效!