PyQt4: существующее текстовое поле и кнопки удалены, но не отображаются новые метки - PullRequest
0 голосов
/ 12 апреля 2019

Здесь я создал пользовательский интерфейс, используя pyqt4 для одного метода обработки файлов. Концепция ООП используется здесь для реализации. Сначала выберите путь, используя кнопку обзора, и путь, вставленный в текстовое поле

from PyQt4 import QtGui, QtCore
import sys
from PyQt4.QtGui import QLabel, QPixmap

class Second(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(Second, self).__init__(parent)


class First(QtGui.QMainWindow):

    def __init__(self, parent=None):
        super(First, self).__init__(parent)
        self.labl = QtGui.QLabel(self)
        self.setGeometry(550, 200, 550, 300)
        self.setWindowTitle('-VDT')


        self.logo=QLabel(self)
        self.logo.setPixmap(QPixmap("logo.jpg"))
        self.logo.move(130, 30)

        self.browse_btn = QtGui.QPushButton('Browse', self)
        self.browse_btn.move(430, 110)

        self.start_btn = QtGui.QPushButton('Start', self)
        self.start_btn.move(150, 200)
        self.textbox = QtGui.QLineEdit(self)
        self.textbox.move(80, 110)
        self.textbox.resize(330, 25)


        self.browse_btn.clicked.connect(self.browse)
        self.start_btn.clicked.connect(self.start)
        self.dialog = Second(self)

    def browse(self):
        file = str(QtGui.QFileDialog.getExistingDirectory(self, "Select Directory"))

        self.textbox.setText(file)


    def start(self):
        # self.dialog.setGeometry(550, 200, 550, 300)
        # self.dialog.show()
        dir_path= self.textbox.text()
        print(dir_path)

        self.start_btn.deleteLater()
        self.browse_btn.deleteLater()
        self.textbox.deleteLater()

        self.label1 = QtGui.QLabel(self)
        self.label1.setText("Started Processing")
        self.label1.move(30, 110)

        self.label2 = QtGui.QLabel(self)
        self.label2.setText("Total files")
        self.label2.move(30, 160)

        self.label3 = QtGui.QLabel(self)
        self.label3.setText("Processed Files")
        self.label3.move(30, 210)

        Total_no_of_files= number
        self.label4 = QtGui.QLabel(self)
        self.label4.setText(Total_no_of_files)         #Have to add number of files in the selected folder
        self.label4.move(240, 160)


        self.label5 = QtGui.QLabel(self)
        self.label5.setText(Processed_no_of_files)  # Have to add number of files processing, this value will increment from 1 to total number of files
        self.label5.move(30, 210)               #



def main():
    app = QtGui.QApplication(sys.argv)
    main = First()
    main.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

При нажатии кнопки запуска текстовое поле и кнопки удаляются с помощью метода deletelater (). Затем я добавил несколько ярлыков. Ниже приведены вопросы.

1) Небольшая часть изображения логотипа показывает

2) Недавно добавленные ярлыки не отображаются

3) Вновь добавленное значение label5 должно быть изменено во время прохождения процесса в цикле for. (в tkinter я использовал intvar () и root.update () для этого)

Как я могу решить эту проблему?

Обновлен Я изменил свой код, основываясь на вашем ответе, но кнопки и текстовые поля не удаляются, и теперь метки перекрываются со старыми кнопками и текстовым полем. Пожалуйста, смотрите следующий код

from PyQt4 import QtGui, QtCore
import sys
import os

from PyQt4.QtGui import QLabel, QPixmap

class Second(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(Second, self).__init__(parent)


class First(QtGui.QMainWindow):

    def __init__(self, parent=None):
        super(First, self).__init__(parent)
        self.labl = QtGui.QLabel(self)
        self.setGeometry(550, 200, 550, 300)
        self.setWindowTitle('-VDT')


        self.logo=QLabel(self)
        self.logo.setPixmap(QPixmap("logo.jpg"))
        self.logo.move(130, 30)
        self.logo.setVisible(True)
        self.browse_btn = QtGui.QPushButton('Browse', self)
        self.browse_btn.move(430, 110)

        self.start_btn = QtGui.QPushButton('Start', self)
        self.start_btn.move(150, 200)
        self.textbox = QtGui.QLineEdit(self)
        self.textbox.move(80, 110)
        self.textbox.resize(330, 25)


        self.browse_btn.clicked.connect(self.browse)
        self.start_btn.clicked.connect(self.start)
        self.dialog = Second(self)

    def browse(self):
        file = str(QtGui.QFileDialog.getExistingDirectory(self, "Select Directory"))

        self.textbox.setText(file)


    def start(self):
        # self.dialog.setGeometry(550, 200, 550, 300)
        # self.dialog.show()
        dir_path= self.textbox.text()
        print(dir_path)
        list_dir = os.listdir(dir_path)
        dir_length = len(list_dir)
        self.start_btn.deleteLater()
        self.browse_btn.deleteLater()
        self.textbox.deleteLater()
        self.logo.setVisible(True)
        self.label1 = QtGui.QLabel(self)
        self.label1.setText("Started Processing")
        self.label1.move(30, 110)
        self.label1.setVisible(True)
        self.label2 = QtGui.QLabel(self)
        self.label2.setText("Total files")
        self.label2.move(30, 160)
        self.label2.setVisible(True)
        self.label3 = QtGui.QLabel(self)
        self.label3.setText("Processed Files")
        self.label3.move(30, 210)
        self.label3.setVisible(True)
        Total_no_of_files= dir_length
        self.label4 = QtGui.QLabel(self)
        self.label4.setText(str(dir_length))         #Have to add number of files in the selected folder
        self.label4.move(240, 160)
        self.label4.setVisible(True)
        self.label5 = QtGui.QLabel(self)
        self.label5.move(240, 210)
        self.label5.setVisible(True)



        path = dir_path
        TEST_IMAGE_PATHS = [f for f in os.listdir(path) if f.endswith('.jpg')]
        # print(TEST_IMAGE_PATHS)
        Total_No_Files = len(TEST_IMAGE_PATHS)

        import cv2
        comp_no_files=0
        for filename in TEST_IMAGE_PATHS:
            image_path= path+'//'+filename
            print(image_path)
            image = cv2.imread(image_path)
            img = cv2.resize(image, (660, 340))
            cv2.imshow('Show Image', img)
            cv2.waitKey(1)
            cv2.destroyAllWindows()
            comp_no_files += 1
            self.label5.setText(str(comp_no_files))




def main():

    app = QtGui.QApplication(sys.argv)

    main = First()
    main.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

1 Ответ

0 голосов
/ 12 апреля 2019

Вы setVisible(True) на каждой этикетке.

Почему ярлыки не отображаются после deleteLater ()?

deleteLater() не имеет значения относительно вашей проблемы.

В python, в основном, вы подготавливаете настройки перед их отображением.

setGeometry(), setPixmap(), установите ..... все настройки.

и когда отображается родительский виджет, отображаются все настройки.

А вот надписи на проблеме, окно уже было показано.

Итак, вы должны setVisible(True) ясно.

То есть, вы устанавливаете метки в первый раз, в конструкторе init ярлыки скоро появятся.

Я думаю, что есть исключение относительно основной мысли о python, я понятия не имею, кроме как по причине.

1.2 решается с помощью setVisible (True).

на вопрос 3,

Важно измерить номер каталога.

label5 Issue Как правило, setText() выполняется один раз. Я рекомендую иногда настраивать ваш код для подсчета числа во время обработки некоторых действий, но сейчас не время. Потому что в этом нет необходимости.

Если вы хотите показать изменение номера, вы выполняете его в последовательности или на временной шкале.

Если ваша фолда очень большая, и у вас есть большое количество фолдов, вы можете естественным образом увидеть изменение последовательности или во время нее.

for num in sequence:
    label5.setText(str(num))

но я понял, что вы хотели показать изменение в любом случае, поэтому я использовал QTimeLine

от 0 до dir_length, 2000 мс, номер будет изменен после QTimeLine.start() в коде.

От вас зависит, когда вы подключитесь таким образом, посчитаете ли вы количество фолдов. Я думаю, что сейчас не могу сказать это ясно.

Я не объясняю, как это сделать здесь. пожалуйста, добавьте эти команды.

import os #at the first line of your editor.
-----------------------------
dir_path= self.textbox.text() # under the function of start
print(dir_path)
list_dir = os.listdir(dir_path)
dir_length = len(list_dir)

в моем случае, как результат, пожалуйста, попробуйте этот код.

Обновлено В моем случае с этим проблем не было. Кнопки и текстовые поля полностью скрыты. Но в вашем случае оно остается после нажатия кнопки пуска.

Я пытался изменить ваш код с deleteLater() на setVisible(False)

self.start_btn.setVisible(False
self.browse_btn.setVisible(False)
self.textbox.setVisible(False)

Если вы не можете решить проблему, пожалуйста, дайте мне комментарий.


import os

from PyQt4.QtGui import QLabel, QPixmap

class Second(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(Second, self).__init__(parent)


class First(QtGui.QMainWindow):

    def __init__(self, parent=None):
        super(First, self).__init__(parent)
        self.labl = QtGui.QLabel(self)
        self.setGeometry(550, 200, 550, 300)
        self.setWindowTitle('-VDT')


        self.logo=QLabel(self)
        self.logo.setPixmap(QPixmap("logo.jpg"))
        self.logo.move(130, 30)
        self.logo.setVisible(True)
        self.browse_btn = QtGui.QPushButton('Browse', self)
        self.browse_btn.move(430, 110)

        self.start_btn = QtGui.QPushButton('Start', self)
        self.start_btn.move(150, 200)
        self.textbox = QtGui.QLineEdit(self)
        self.textbox.move(80, 110)
        self.textbox.resize(330, 25)


        self.browse_btn.clicked.connect(self.browse)
        self.start_btn.clicked.connect(self.start)
        self.dialog = Second(self)

    def browse(self):
        file = str(QtGui.QFileDialog.getExistingDirectory(self, "Select Directory"))

        self.textbox.setText(file)


    def start(self):
        # self.dialog.setGeometry(550, 200, 550, 300)
        # self.dialog.show()
        dir_path= self.textbox.text()
        print(dir_path)
        list_dir = os.listdir(dir_path)
        dir_length = len(list_dir)
        self.start_btn.setVisible(False)
        self.browse_btn.setVisible(False)
        self.textbox.setVisible(False)
        self.logo.setVisible(True)
        self.label1 = QtGui.QLabel(self)
        self.label1.setText("Started Processing")
        self.label1.move(30, 110)
        self.label1.setVisible(True)
        self.label2 = QtGui.QLabel(self)
        self.label2.setText("Total files")
        self.label2.move(30, 160)
        self.label2.setVisible(True)
        self.label3 = QtGui.QLabel(self)
        self.label3.setText("Processed Files")
        self.label3.move(30, 210)
        self.label3.setVisible(True)
        Total_no_of_files= dir_length
        self.label4 = QtGui.QLabel(self)
        self.label4.setText(str(dir_length))         #Have to add number of files in the selected folder
        self.label4.move(240, 160)
        self.label4.setVisible(True)
        self.label5 = QtGui.QLabel(self)
        self.label5.move(240, 210)
        self.label5.setVisible(True)



        path = dir_path
        TEST_IMAGE_PATHS = [f for f in os.listdir(path) if f.endswith('.jpg')]
        # print(TEST_IMAGE_PATHS)
        Total_No_Files = len(TEST_IMAGE_PATHS)

        import cv2
        comp_no_files=0
        for filename in TEST_IMAGE_PATHS:
            image_path= path+'//'+filename
            print(image_path)
            image = cv2.imread(image_path)
            img = cv2.resize(image, (660, 340))
            cv2.imshow('Show Image', img)
            cv2.waitKey(1)
            cv2.destroyAllWindows()
            comp_no_files += 1
            self.label5.setText(str(comp_no_files))




def main():

    app = QtGui.QApplication(sys.argv)

    main = First()
    main.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

после обновления обработанный файл равен 1., потому что у меня есть файл jpg.

result

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...