在同一函数中访问子接口值

2024-09-29 02:21:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个类-主接口和子接口

有一个按钮将调用子界面,我试图直接(或几乎立即)获得子工具界面的输出,以便在按钮功能中使用

在我的代码中,如果我执行以下操作:

  • 点击“点击我”
  • 选中2个选项并点击子界面中的“应用到所选项目”
  • “我的dict值”的打印行仍然为空

除非我创建另一个函数get_results,其中self.my_dict将正确显示

因此,我如何对其进行编码,使其在点击“应用…”按钮后,self.my_dict将被更新,而无需创建另一个函数?还是我只是想得太多了

class SubMenuWindow(QtGui.QWidget):
    def __init__(self, menu_items, parent=None):
        super(SubMenuWindow, self).__init__(parent)
        self.my_lyt = QtGui.QVBoxLayout()
        self.checked_options = []
        self.sel = {}

        for menu_name, submenu_name in menu_items.items():
            # Set the main menu item name
            self.groupbox = QtGui.QGroupBox(self)
            self.groupbox.setTitle(menu_name)
            self.groupbox.setLayout(QtGui.QVBoxLayout())
            self.my_lyt.addWidget(self.groupbox)

            if submenu_name:
                sub_txt = [action for action in submenu_name]
                for s in sub_txt:
                    sub_chk = QtGui.QCheckBox(s)
                    self.checked_options.append(sub_chk)
                    self.groupbox.layout().addWidget(sub_chk)

        apply_tag_btn = QtGui.QPushButton('Apply to selected item')
        apply_tag_btn.clicked.connect(self.get_checked_options)

        self.my_lyt.addWidget(apply_tag_btn)
        self.my_lyt.addStretch()

        self.setLayout(self.my_lyt)
        self.show()

    def get_checked_options(self):
        for f in self.checked_options:
            if f.isChecked():
                self.sel[f.parent().title()] = f.text()

class MainWin(QtGui.QWidget):
    def __init__(self, parent=None):
        super(MainWin, self).__init__(parent)

        self.my_dict = {}

        btnA = QtGui.QPushButton('Click Me')
        btnA.clicked.connect(self.get_options)

        btnB = QtGui.QPushButton('Get results')
        btnB.clicked.connect(self.get_results)

        layout = QtGui.QVBoxLayout()
        layout.addWidget(btnA)
        layout.addWidget(btnB)
        self.setLayout(layout)

    def get_options(self):
        sample_dict = {'GrpA' : ['John', 'Zack'], 'GrpB' : ['Alice', 'Phan']}
        self.subWin = SubMenuWindow(sample_dict)

        # I had want to get the values from subWin as soon as User has hit on
        # the 'Apply to selected item' button
        self.my_dict = self.subWin.sel
        print ">>> my dict values : ", self.my_dict
        # do something else from here thereafter...

    def get_results(self):
        print self.subWin.sel

Tags: nameselfgetmydefdictparentoptions
1条回答
网友
1楼 · 发布于 2024-09-29 02:21:15

创建新窗口不会被阻止,因此打印语句将在用户选择任何内容之前执行。当用户更改选择时,您可以传入回调以通知调用小部件

例如:

class SubMenuWindow(QtWidgets.QWidget):
    def __init__(self, menu_items, parent=None, callback=None):
        super(SubMenuWindow, self).__init__(parent)
        self.callback = callback
        [...]

    def get_checked_options(self):
        for f in self.checked_options:
            if f.isChecked():
                self.sel[f.parent().title()] = f.text()
        if self.callback:
            self.callback()

并传入回调:

    def get_options(self):
        sample_dict = {'GrpA' : ['John', 'Zack'], 'GrpB' : ['Alice', 'Phan']}
        self.subWin = SubMenuWindow(sample_dict, callback=self.get_results)
        [...]

这样,每当用户单击SubMenuWindow中的应用按钮时,就会调用get_result方法

相关问题 更多 >