PyQt4:现有的文本框和按钮已删除,但未显示新标签

时间:2019-04-12 10:23:10

标签: python user-interface pyqt

在这里,我已经使用pyqt4为一种文件处理方法创建了UI。 OOPs概念在这里用于实现。首先使用浏览按钮选择路径,然后将路径插入文本框

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)在for循环中执行过程时,必须更改新添加的label5值。 (在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 :(得分:0)

setVisible(True)在每个标签上。

为什么在deleteLater()之后不显示标签?

deleteLater()对您的问题没有影响。

基本上,在python中,您需要先准备设置,然后再显示它们。

setGeometry()setPixmap(),设置...所有设置。

,并且在显示父窗口小部件时,将显示所有设置。

但是关于问题的标签,该窗口已经显示。

因此,您必须清楚setVisible(True)

也就是说,您是第一次设置标签,在 init 构造函数中,标签很快就会显示。

我认为python的基本思想是个例外,除了原因之外我什么都不知道。

1.2由setVisible(True)解决。

问题3,

重要的是测量目录数。

label5问题 基本上setText()执行一次。 我建议您有时自定义代码,以便在处理某些操作时对数字进行计数,但现在还不是时候。因为没有必要这样做。

如果要显示数字的变化,请在顺序或时间轴上执行。

如果折叠非常大,并且具有大量折叠,则可以自然地看到for或while序列的变化。

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