Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 包含单独文件中的菜单栏_Python_Python 3.x_Pyqt - Fatal编程技术网

Python 包含单独文件中的菜单栏

Python 包含单独文件中的菜单栏,python,python-3.x,pyqt,Python,Python 3.x,Pyqt,我正在尝试从单独的文件中包含菜单栏,并尝试连接函数 我包括一些代码,我有同样的问题 福比 从PyQt5.QtWidgets导入* 从PyQt5.uic导入loadUiType 导入操作系统 导入系统 从菜单导入菜单 在\u MAIN中,\uu=loadUiType(os.path.join(os.path.dirname(\uuu文件);“SalesGui.ui”)) 主类(QMainWindow,从主类): def uuu init uuu(self,parent=None): 超级(主、自)

我正在尝试从单独的文件中包含菜单栏,并尝试连接函数

我包括一些代码,我有同样的问题

福比

从PyQt5.QtWidgets导入*
从PyQt5.uic导入loadUiType
导入操作系统
导入系统
从菜单导入菜单
在\u MAIN中,\uu=loadUiType(os.path.join(os.path.dirname(\uuu文件);“SalesGui.ui”))
主类(QMainWindow,从主类):
def uuu init uuu(self,parent=None):
超级(主、自).\uuuu初始化\uuuuuu(父)
self.setupUi(self)
self.MyMenu=菜单(self)
self.MyMenu.NewProduct.triggered.connect(self.NewProduct())
def新产品(自我):
打印(“foo”)
def main():
app=QApplication(sys.argv)
window=Main()
window.show()
app.exec()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
尝试:
main()
例外情况除外,原因如下:
打印(为什么)
和foodmenu.py

从PyQt5.QtGui导入QIcon
从PyQt5.qtwidts导入QAction、QMenu
def菜单(自我):
mainMenu=self.menuBar()
fileMenu=mainMenu.addMenu('FooMenu'))
NewProduct=QAction(QIcon('icons/exit.png'),'Foo',self)
NewProduct.setShortcut('Ctrl+Q')
NewProduct.setStatusIP('FooAction'))
fileMenu.addAction(新产品)
当尝试将“NewProduct”按钮与“New Product”功能连接时,我得到以下错误

'NoneType'对象没有属性“NewProduct”

试试看:

import os
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QAction, QMenu

#from PyQt5.uic import loadUiType
#from foomenu import menu
#FROM_MAIN, _ = loadUiType(os.path.join(os.path.dirname(__file__), "SalesGui.ui"))

def menu(self):
    mainMenu = self.menuBar()
    fileMenu = mainMenu.addMenu('FooMenu')

    self.NewProduct = QAction(QIcon('exit.png'), 'Foo', self)  # 'icons/exit.png'  # + self
    self.NewProduct.setShortcut('Ctrl+Q')
    self.NewProduct.setStatusTip('FooAction')
    fileMenu.addAction(self.NewProduct)

    return self.NewProduct                                                         # +++

class Main(QMainWindow):#, FROM_MAIN):
    def __init__(self, parent=None):
        super(Main, self).__init__(parent)
#        self.setupUi(self)

        self.MyMenu = menu(self)

#        self.MyMenu.NewProduct.triggered.connect(self.funcNewProduct)             # - ()
        self.MyMenu.triggered.connect(self.funcNewProduct)                         # +

    def funcNewProduct(self):
        print("foo")
        qApp.quit()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Main()
    window.show()
    app.exec_()

在另一个python文件中对菜单栏进行子类化和设置,然后在保存主类的文件中导入并实例化该类,这要优雅得多

在MyMenu类中,您可以将信号绑定到本地套接字,从这里可以为父类提供sender对象

顺便说一句,您可以迭代菜单栏/菜单的action对象,但维护和控制要比显式描述连接潜在不同操作的位置困难得多

Menu.py:


    class MyMenu(QMenuBar):

        new_product_clicked = Signal(object)

        def __init__(self, parent=None):
            super(MyMenu, self).__init__(parent)

            file_menu = QMenu("File menu", self)
            new_product_action = QAction('Foo', self)
            new_product_action.setShortcut('Ctrl+Q')
            new_product_action.setStatusTip('FooAction')
            new_product_action.triggered.connect(self.new_product_clicked)
            file_menu.addAction(new_product_action)

            self.addMenu(file_menu)

        def new_product_clicked(self):
            """ Call a method from the parent class. """
            self.new_product_clicked.emit(self.sender())

Main.py:

from Menu import MyMenu


class Main(QMainWindow):

    def __init__(self, parent=None):
        super(Main, self).__init__(parent)

        my_menu = MyMenu(self)
        self.setMenuBar(my_menu)
        self.my_menu.new_product_clicked.connect(self.product_clicked)

    def product_clicked(self, action):
        """ Socket for the clicked action """
        clicked_action = action
        print clicked_action.text()



if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Main()
    window.show()
    app.exec_()

您的信号/插槽设置不正确-事实上,除了您调用它们之外,它们既不是信号也不是插槽-只是一个直接的函数调用-检查一下,即使您的实际信号也没有插槽,虽然可以这样做-但是显式编码比惰性编码好;)是的,对,再发射一个信号会更好。我改了。