【问题标题】:Get input from custom dialog with entry, ok, and cancel button and return - Python/GTK3从自定义对话框中获取输入、确定和取消按钮并返回 - Python/GTK3
【发布时间】:2014-08-23 10:29:15
【问题描述】:

在带有 gobject 的 Python 中,我在从用户那里获取输入时遇到了巨大的问题。

这是我的代码:

def get_network_pw(self, e):
        def okClicked(self):
            print(pwd.get_text())
            return pwd.get_text()
            pwDialog.destroy()

        def cancelClicked(self):
            print("nope!")
            pwDialog.hide()
            return None

        #Getting the about dialog from UI.glade
        pwDialog = self.builder.get_object("passwordDialog")
        okBtn = self.builder.get_object("pwdOkBtn")
        cancelBtn = self.builder.get_object("pwdCancelBtn")
        pwd = self.builder.get_object("userEntry")
        # Opening the about dialog.
        #okBtn.connect("clicked", okClicked)
        #cancelBtn.connect("clicked", cancelClicked)
        pwDialog.run()

我不确定我哪里出错了?它拒绝返回 userEntry 文本。我还尝试了Python/Gtk3 : How to add a Gtk.Entry to a Gtk.MessageDialog?Simple, versatile and re-usable entry dialog (sometimes referred to as input dialog) in PyGTK 的代码,但无济于事。

编辑 我在林间空地做了一个对话。它包含一个 GtkTextBox (userEntry)、一个确定按钮 (pwdOkBtn) 和一个取消按钮 (pwdCancelBtn)。当用户单击确定时,理论上它应该返回他们在文本框中输入的内容(例如 1234)。当他们单击取消时,它应该返回无。但是,当他们单击确定时,它返回“”,当他们单击取消时,它返回“”。我不确定我哪里出错了。

额外代码尝试:

我也尝试了以下代码:

def get_network_pw(self, e):
        d = GetInputDialog(None, "Enter Password")
        dialog = d.run()
        if dialog is 1:
            print("OK")
        else:
            print("Nope!")
        d.hide()

获取输入对话框:

class GetInputDialog(Gtk.Dialog):
    def __init__(self, parent, title):
        Gtk.Dialog._init(self, title, parent)
        self.response = "Cancel"
        self.setupHeader()
        self.setupUI()

    def setupUI(self):

        wdg = self.get_content_area() #explained bellow

        self.txtSource = Gtk.Entry() #create a text entry
        wdg.add(self.txtSource)
        self.show_all() #show the dialog and all children

    def setupHeader(self, title="Get User Input"):
        hb = Gtk.HeaderBar()
        hb.props.show_close_button = True
        hb.props.title = title
        self.set_titlebar(hb)

        btnOk = Gtk.Button("OK")
        btnOk.connect("clicked", self.btnOkClicked)
        hb.pack_start(btnOk)

        btnCancel = Gtk.Button("Cancel")
        btnCancel.connect("clicked", self.btnCancelClicked)
        hb.pack_start(btnCancel)

    def btnOkClicked(self, e):
        self.response = "Ok" #set the response var
        dst = self.txtSource #get the entry with the url
        txt = dst.get_text()
        return 1

    def btnCancelClicked(self, e):
        self.response = "Cancel"
        return -1

【问题讨论】:

  • 你的问题很笼统。您面临的确切问题是什么?什么是拒绝返回 userEntry 文本的“IT”?什么是 userEntry?
  • 我认为我的编辑应该涵盖它。对于那个很抱歉! :)

标签: python python-3.x pygobject


【解决方案1】:

我认为你过于复杂了。 run 方法返回对话框中按下的按钮的 id:

  1. 不要以这种方式使用.hide().destroy() 方法,它们适用于不同的情况。 .destroy() 会破坏小部件,因此除非您知道自己在做什么,否则不应调用它。

  2. .hide() 放在.run() 之后。

  3. 捕获run() 的返回值,并将对话框中的按钮设置为Glade 中的不同响应ID

代码的相关部分是:

def _btn_cb(self, widget, data=None):
    """
    Button callback
    """
    ret = self.dialog.run()
    self.dialog.hide()
    if ret == 0:
        self.label.set_text(
            self.entry.get_text()
        )

这个例子的完整代码在这里:

https://gist.github.com/carlos-jenkins/c27bf6d5d76723a4b415

Extra:如果你想检查一个接受Ok按钮的条件(不知道,例如该条目是否有效)在while循环中执行run(),检查是否按钮是取消然后中断,否则检查输入的有效性,如果有效则做某事并中断,否则继续:

def _btn_cb(self, widget, data=None):
    """
    Button callback
    """
    while True:
        ret = self.dialog.run()
        if ret == -1:  # Cancel
            break

        try:
            entry = int(self.entry.get_text())
            self.label.set_text(str(entry))
            break
        except ValueError:
            # Show in an error dialog or whatever
            print('Input is not an integer!')

    self.dialog.hide()

【讨论】:

  • 我仍然无法让它工作。我在主要评论中添加了一些我尝试过的东西。当我单击“确定”按钮时,文本条目变灰,但它不会发回响应 (1) 或确定(我尝试同时检查两者,但均无效)。
  • 这不是它的工作原理。同样,您不应该在对话框按钮上粘贴回调。你认为按钮回调的返回值是多少?它会神奇地作为run() 方法的返回出现吗?不。你试过我发给你的代码吗?
  • 对不起,我实现了一半,还是不行,所以我尝试了别的。查看完整示例后(抱歉,我没有注意到链接)我能够让它工作。你是天赐之物!
猜你喜欢
  • 2012-01-10
  • 1970-01-01
  • 2019-04-27
  • 1970-01-01
  • 1970-01-01
  • 2017-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多