如何在 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 中的各种信号调用的方法。
我在以不创建循环导入的方式设计我的代码时遇到了问题。
我有一个事件处理程序文件,如下所示:
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 中的各种信号调用的方法。