【问题标题】:Link a pushbutton to run a .py file链接按钮以运行 .py 文件
【发布时间】:2019-10-06 10:17:02
【问题描述】:

我想要做的是能够通过单击 main.py 上的按钮打开 grid.py。最好保持相同的结构(ui 文件以及主要和网格 python 文件)。谢谢,

因此,我创建了一个简单的 UI 界面,其中仅包含一个带有 Qt 设计器的按钮 (test-open.ui):

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>604</width>
    <height>424</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QPushButton" name="pushButton">
    <property name="geometry">
     <rect>
      <x>230</x>
      <y>160</y>
      <width>75</width>
      <height>23</height>
     </rect>
    </property>
    <property name="text">
     <string>PushButton</string>
    </property>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>604</width>
     <height>21</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

然后我创建了主 .py 文件(ma​​in.py):

from PyQt5 import QtWidgets, uic

app = QtWidgets.QApplication([])
dlg = uic.loadUi(r"E:\Python\Project\test-open.ui")

dlg.show()
app.exec()

最后,这是我用 WxPython 创建的一个网格,我希望通过单击按钮来打开它 (grid.py)

import sys

from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QAction, QTableWidget,QTableWidgetItem,QVBoxLayout
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import pyqtSlot


class App(QWidget):

    def __init__(self):
        super().__init__()
        self.title = 'PyQt5 table - pythonspot.com'
        self.left = 0
        self.top = 0
        self.width = 460
        self.height = 200
        self.initUI()

    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        self.createTable()

        # Add box layout, add table to box layout and add box layout to widget
        self.layout = QVBoxLayout()
        self.layout.addWidget(self.tableWidget) 
        self.setLayout(self.layout) 

        # Show widget
        self.show()

    def createTable(self):
       # Create table
        self.tableWidget = QTableWidget()
        self.tableWidget.setRowCount(4)
        self.tableWidget.setColumnCount(4)
        self.tableWidget.setItem(0,0, QTableWidgetItem("Cell (1,1)"))
        self.tableWidget.setItem(0,1, QTableWidgetItem("Cell (1,2)"))
        self.tableWidget.setItem(0,2, QTableWidgetItem("Cell (1,1)"))
        self.tableWidget.setItem(0,3, QTableWidgetItem("Cell (1,2)"))
        self.tableWidget.setItem(0,4, QTableWidgetItem("Cell (1,1)"))

        self.tableWidget.setItem(1,0, QTableWidgetItem("Cell (1,1)"))
        self.tableWidget.setItem(1,1, QTableWidgetItem("Cell (1,2)"))
        self.tableWidget.setItem(1,2, QTableWidgetItem("Cell (1,1)"))
        self.tableWidget.setItem(1,3, QTableWidgetItem("Cell (1,2)"))
        self.tableWidget.setItem(1,4, QTableWidgetItem("Cell (1,1)"))

        self.tableWidget.setItem(2,0, QTableWidgetItem("Cell (1,1)"))
        self.tableWidget.setItem(2,1, QTableWidgetItem("Cell (1,2)"))
        self.tableWidget.setItem(2,2, QTableWidgetItem("Cell (1,1)"))
        self.tableWidget.setItem(2,3, QTableWidgetItem("Cell (1,2)"))
        self.tableWidget.setItem(2,4, QTableWidgetItem("Cell (1,1)"))

        self.tableWidget.setItem(3,0, QTableWidgetItem("Cell (1,1)"))
        self.tableWidget.setItem(3,1, QTableWidgetItem("Cell (1,2)"))
        self.tableWidget.setItem(3,2, QTableWidgetItem("Cell (1,1)"))
        self.tableWidget.setItem(3,3, QTableWidgetItem("Cell (1,2)"))
        self.tableWidget.setItem(3,4, QTableWidgetItem("Cell (1,1)"))
        self.tableWidget.move(0,0)

        # table selection change
        self.tableWidget.doubleClicked.connect(self.on_click)

    @pyqtSlot()
    def on_click(self):
        print("\n")
        for currentQTableWidgetItem in self.tableWidget.selectedItems():
            print(currentQTableWidgetItem.row(), currentQTableWidgetItem.column(), currentQTableWidgetItem.text())

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())  

【问题讨论】:

    标签: python pyqt pyqt5 qt-designer qpushbutton


    【解决方案1】:

    您混淆了概念,程序不是一组文件,而是基于类创建的对象之间的交互。所以在实现任何东西之前,我会假设文件具有以下结构:

    ├── grid.py
    ├── main.py
    └── test-open.ui
    

    另一方面,在 App 类构造函数中,您正在显示窗口,这不是您想要的,最初必须关闭窗口,因此我将删除该行。切入正题,您必须在 main 中导入 grid 模块才能创建 App 小部件对象。

    grid.py

    import sys
    
    from PyQt5.QtWidgets import (
        QMainWindow,
        QApplication,
        QWidget,
        QAction,
        QTableWidget,
        QTableWidgetItem,
        QVBoxLayout,
    )
    from PyQt5.QtGui import QIcon
    from PyQt5.QtCore import pyqtSlot
    
    
    class App(QWidget):
        def __init__(self):
            super().__init__()
            self.title = "PyQt5 table - pythonspot.com"
            self.left = 0
            self.top = 0
            self.width = 460
            self.height = 200
            self.initUI()
    
        def initUI(self):
            self.setWindowTitle(self.title)
            self.setGeometry(self.left, self.top, self.width, self.height)
    
            self.createTable()
    
            # Add box layout, add table to box layout and add box layout to widget
            self.layout = QVBoxLayout()
            self.layout.addWidget(self.tableWidget)
            self.setLayout(self.layout)
    
        def createTable(self):
            # Create table
            self.tableWidget = QTableWidget()
            self.tableWidget.setRowCount(4)
            self.tableWidget.setColumnCount(4)
            self.tableWidget.setItem(0, 0, QTableWidgetItem("Cell (1,1)"))
            self.tableWidget.setItem(0, 1, QTableWidgetItem("Cell (1,2)"))
            self.tableWidget.setItem(0, 2, QTableWidgetItem("Cell (1,1)"))
            self.tableWidget.setItem(0, 3, QTableWidgetItem("Cell (1,2)"))
            self.tableWidget.setItem(0, 4, QTableWidgetItem("Cell (1,1)"))
    
            self.tableWidget.setItem(1, 0, QTableWidgetItem("Cell (1,1)"))
            self.tableWidget.setItem(1, 1, QTableWidgetItem("Cell (1,2)"))
            self.tableWidget.setItem(1, 2, QTableWidgetItem("Cell (1,1)"))
            self.tableWidget.setItem(1, 3, QTableWidgetItem("Cell (1,2)"))
            self.tableWidget.setItem(1, 4, QTableWidgetItem("Cell (1,1)"))
    
            self.tableWidget.setItem(2, 0, QTableWidgetItem("Cell (1,1)"))
            self.tableWidget.setItem(2, 1, QTableWidgetItem("Cell (1,2)"))
            self.tableWidget.setItem(2, 2, QTableWidgetItem("Cell (1,1)"))
            self.tableWidget.setItem(2, 3, QTableWidgetItem("Cell (1,2)"))
            self.tableWidget.setItem(2, 4, QTableWidgetItem("Cell (1,1)"))
    
            self.tableWidget.setItem(3, 0, QTableWidgetItem("Cell (1,1)"))
            self.tableWidget.setItem(3, 1, QTableWidgetItem("Cell (1,2)"))
            self.tableWidget.setItem(3, 2, QTableWidgetItem("Cell (1,1)"))
            self.tableWidget.setItem(3, 3, QTableWidgetItem("Cell (1,2)"))
            self.tableWidget.setItem(3, 4, QTableWidgetItem("Cell (1,1)"))
            self.tableWidget.move(0, 0)
    
            # table selection change
            self.tableWidget.doubleClicked.connect(self.on_click)
    
        @pyqtSlot()
        def on_click(self):
            print("\n")
            for currentQTableWidgetItem in self.tableWidget.selectedItems():
                print(
                    currentQTableWidgetItem.row(),
                    currentQTableWidgetItem.column(),
                    currentQTableWidgetItem.text(),
                )
    
    
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        ex = App()
        ex.show()
        sys.exit(app.exec_())
    

    ma​​in.py

    from PyQt5 import QtWidgets, uic
    from grid import App
    
    
    if __name__ == "__main__":
        import os
        import sys
    
        app = QtWidgets.QApplication(sys.argv)
        file = os.path.join(
            os.path.dirname(os.path.realpath(__file__)), "test-open.ui"
        )
        dlg = uic.loadUi(file)
        w = App()
        dlg.pushButton.clicked.connect(w.show)
        dlg.show()
        sys.exit(app.exec_())
    

    【讨论】:

    • 谢谢@eyllanesc,它工作得很好。你说的是哪一行显示窗口?最后一个问题,如果你允许我,如果我的 main.py 上有两个按钮,我如何区分哪个按钮被点击了?
    • @CreekBarbara 1) 显示窗口的行如下dlg.pushButton.clicked.connect(w.show) 2) 在 .ui 中,每个按钮都有一个名称:&lt;widget class="QPushButton" name="pushButton"&gt;,所以如果你有另一个按钮,它就会有另一个名称
    • 我在您发布答案的那一刻就知道了这个名字:)。对于第一个问题,我问的是你从我的代码中删除的那一行,我不能指望它。再次感谢您
    • @CreekBarbara 这行# Show widget self.show()
    猜你喜欢
    • 1970-01-01
    • 2013-05-05
    • 2020-10-11
    • 1970-01-01
    • 2016-06-30
    • 2021-03-31
    • 1970-01-01
    • 1970-01-01
    • 2019-01-28
    相关资源
    最近更新 更多