вызывающая функция pyqt5 не дает таких же результатов - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь разработать графический интерфейс, чтобы показать моего робота и препятствия вокруг него. Я создал графический интерфейс класса, и он имеет функцию-член showObstacle, чтобы показать препятствие. Поскольку я хочу сохранить все препятствия на месте, я создаю новый объект препятствий в векторе для хранения всех объектов.

Я вызвал эту функцию в init функции класса для проверки, и она прошла успешно.

Но когда я вызываю эту функцию в другом классе, она не показывает препятствий в окне GUI. В классе TCP_Connection (где я получаю информацию о роботе) я создал класс myGui и вызвал функцию showObstacle.

После отладки выясняется, что он создает объекты препятствий при каждом вызове, но не отображает их в окне

#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

Отредактировано2: код теперь исполняемый

Suppose to show 4 obstacles but only shows 2

1 Ответ

0 голосов
/ 27 апреля 2018

Проблема в том, что QLabel s не отображаются, основной виджет при отображении в начале заставляет ваших детей появляться, но после этого он не делает их видимыми, как в вашем случае, поэтому ваша задача это вызвать их метод 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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...