gpt4 book ai didi

python - 如何将数据从 Gtk 对话框传递/返回到主应用程序类

转载 作者:行者123 更新时间:2023-12-01 08:28:24 25 4
gpt4 key购买 nike

我有一个 Python Gtk 中的应用程序。我的主文件中有我的主要应用程序类。然后我将所有对话框放在不同的文件中。除了标准 Gtk 响应代码之外,我需要能够将自定义数据从对话框传递/返回到主应用程序类,这里是一些基本示例代码,因为我自己的代码很长:

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

class DialogWindow(Gtk.Window):

def __init__(self):
Gtk.Window.__init__(self, title="Dialog Example")

self.set_border_width(6)

button = Gtk.Button("Open dialog")
button.connect("clicked", self.on_button_clicked)

self.add(button)

def on_button_clicked(self, widget):
dialog = DialogExample(self)
response = dialog.run()

if response == Gtk.ResponseType.OK:
print("The OK button was clicked")
elif response == Gtk.ResponseType.CANCEL:
print("The Cancel button was clicked")

dialog.destroy()

win = DialogWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()

单独文件中的对话框窗口:

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

class DialogExample(Gtk.Dialog):

def __init__(self, parent):
Gtk.Dialog.__init__(self, "My Dialog", parent, 0,
(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
Gtk.STOCK_OK, Gtk.ResponseType.OK))

self.set_default_size(150, 100)

label = Gtk.Label("This is a dialog to display additional information")

box = self.get_content_area()
box.add(label)
self.show_all()

作为标准,我们将 Gtk.ResponseType 应用于按钮。但是,如果我们想返回一些自定义数据(而不仅仅是简单的响应代码)作为进一步的代码示例,该怎么办:

class DialogExample(Gtk.Dialog):

def __init__(self, parent):
Gtk.Dialog.__init__(self, "My Dialog", parent, 0)

self.set_default_size(150, 100)

label = Gtk.Label("This is a dialog to display additional information")

button = Gtk.Button("Return something")
button.connect("clicked", self.on_button_clicked)

box = self.get_content_area()
box.add(label)
self.show_all()

def on_button_clicked(self, widget):
if SOME_CONDITION:
return <CUSTOM_RESPONSE>
else:
return <ALT_CUSTOM_RESPONSE>

当我执行最后一个示例时,对话框不会返回任何内容,我想做类似的事情:

class DialogWindow(Gtk.Window):

def __init__(self):
Gtk.Window.__init__(self, title="Dialog Example")

self.set_border_width(6)

button = Gtk.Button("Open dialog")
button.connect("clicked", self.on_button_clicked)

self.add(button)

def on_button_clicked(self, widget):
dialog = DialogExample(self)
response = dialog.run()

if response == <CUSTOM_RESPONSE>:
#do something with <CUSTOM_RESPONSE>
elif response == <ALT_CUSTOM_RESPONSE>:
#do something different with <ALT_CUSTOM_RESPONSE>

dialog.destroy()

win = DialogWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()

DialogExample 窗口不会销毁/关闭,也不会返回任何内容,应用程序基本上只是暂停,因为它认为没有更多方法可以运行 - 尽管在返回自定义数据后还有很多工作要做(我需要然后开始向数据库添加记录)。

[更新]

我现在已经尝试了很多不同的方法来解决这个问题,我不可能在这里全部列出。我无休止地寻找某种答案,似乎这不是互联网上任何人所做的事情。

最佳答案

gtk_dialog_run 的 C 版本仅限于返回整数,您可以设置自定义值,但不能设置类似于字符串或对象的值。您可以通过在“响应”信号上设置一个值来解决此问题,然后在运行函数返回后获取它。

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

class DialogExample(Gtk.Dialog):

def __init__(self, parent):
Gtk.Dialog.__init__(self, "My Dialog", parent, 0,
(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
Gtk.STOCK_OK, Gtk.ResponseType.OK))

self.result = ""
self.set_default_size(150, 100)
self.connect("response", self.on_response)

label = Gtk.Label(label="Type something")
self.entry = Gtk.Entry()

box = self.get_content_area()
box.add(label)
box.add(self.entry)
self.show_all()

def on_response(self, widget, response_id):
self.result = self.entry.get_text ()

def get_result(self):
return self.result

class DialogWindow(Gtk.Window):

def __init__(self):
Gtk.Window.__init__(self, title="Dialog Example")
self.set_border_width(6)

box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
self.add(box)

button = Gtk.Button(label="Open dialog")
button.connect("clicked", self.on_button_clicked)
box.add(button)

self.label = Gtk.Label()
box.add(self.label)

def on_button_clicked(self, widget):
dialog = DialogExample(self)
response = dialog.run()

if response == Gtk.ResponseType.OK:
self.label.set_text(dialog.get_result())
print("The OK button was clicked")
elif response == Gtk.ResponseType.CANCEL:
print("The Cancel button was clicked")

dialog.destroy()

win = DialogWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()

关于python - 如何将数据从 Gtk 对话框传递/返回到主应用程序类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54076575/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com