代码之家  ›  专栏  ›  技术社区  ›  programing_is_hard

pyqt5调用函数不会给出相同的结果

  •  1
  • programing_is_hard  · 技术社区  · 7 年前

    我正在尝试开发一个GUI来显示我的机器人和周围的障碍物。我创建了一个类GUI,它有一个成员函数ShowReshibler来显示障碍。因为我想将所有障碍物保持在适当的位置,所以我在向量中创建新的障碍物对象来存储所有对象。

    我在类的 初始化 功能测试成功。

    但是,当我在不同的类中调用此函数时,它不会在GUI窗口上显示障碍。在类TCP\U Connection(我从中获取机器人的信息)中,我创建了myGui类,并调用了ShowBarrierd函数。

    调试后,它会在每次调用时创建障碍物对象,但不会在窗口上显示

    #this is file 1, GUI Class
    import sys
    from PyQt5 import QtWidgets, QtGui, QtCore
    from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget
    from PyQt5.QtCore import Qt
    from pynput import keyboard
    
    class App(QWidget):
        def __init__(self, OtherWindow):
    
            super().__init__()
            self.setGeometry(100,100,440,800)
            self.setWindowTitle("New GUI Interface Window")
            self.currentState = 0
            self.obstCounter = 0
            self.d = []
    
            #testing showObstacle
            self.showObstacle(205, 305) #this works
            self.showObstacle(210,315)  #this also works
            self.show()
    
        def showObstacle(self, Obs_x, Obs_y):
            self.obstImage = QtGui.QImage('obsta_edited.png')
            self.pixmap_obst = QtGui.QPixmap(self.obstImage)
            self.d.append("O{0}".format(self.obstCounter))
            self.d[self.obstCounter] = QtWidgets.QLabel(self)
            self.d[self.obstCounter].setPixmap(self.pixmap_obst)
            self.d[self.obstCounter].move(Obs_x, Obs_y)
            self.d[self.obstCounter].adjustSize()
            self.obstCounter += 1
    
            print(self.d)
            print("Obstacle Run")
    

    这是呼叫类

    from myGUI import App
    from PyQt5.QtWidgets import QWidget,QLabel,QLineEdit, QHBoxLayout,QVBoxLayout,QMainWindow,QPushButton, QFrame, QDesktopWidget, QApplication
    from PyQt5.Qt import QStackedLayout
    import sys, random
    
    class TCP_Communication:
        def __init__(self):
            super().__init__()
            self.openWindow()
    
        def openWindow(self):
    
            self.window = QMainWindow()
            self.myGui = App(self.window)
            self.myGui.showObstacle(215, 320)
            self.stacked_layout = QStackedLayout()
            self.stacked_layout.addWidget(self.myGui)
    
        def tcp_showObstacle(self,x,y):
            self.myGui.showObstacle(x,y)
    
    
    if __name__ == '__main__':
        app = QApplication([])
        tcp_com = TCP_Communication()
        sys.exit(app.exec_())
    

    编辑:附加结果;假设显示4个障碍,但仅显示2个

    Edited2:代码现在可执行

    Suppose to show 4 obstacles but only shows 2

    1 回复  |  直到 7 年前
        1
  •  2
  •   eyllanesc Yonghwan Shin    7 年前

    问题是 QLabel 如果没有显示,则在开始时显示的主小部件会使您的孩子显示出来,但之后它不会使他们可见,就像您的情况一样,因此您的任务是调用他们的方法 show() 直接:

    def showObstacle(self, Obs_x, Obs_y):
        pixmap_obst = QtGui.QPixmap('obsta_edited.png')
        self.d.append("O{0}".format(self.obstCounter))
        label = QtWidgets.QLabel(self)
        label.setPixmap(pixmap_obst)
        label.move(Obs_x, Obs_y)
        label.adjustSize()
        label.show() # <---show QLabel
    
        self.d[self.obstCounter] = label
        self.obstCounter += 1
    
        print(self.d)
        print("Obstacle Run")