Python 显示白色的窗口
因此,我想制作一个自定义窗口,其中显示操作的进度。当我在没有运行函数的情况下正常显示窗口时,它会显示半秒钟的白色,但每个窗口都是这样,然后显示小部件。但是当我在函数中显示它时,小部件不会显示。下面是代码(在类中):Python 显示白色的窗口,python,pyqt5,Python,Pyqt5,因此,我想制作一个自定义窗口,其中显示操作的进度。当我在没有运行函数的情况下正常显示窗口时,它会显示半秒钟的白色,但每个窗口都是这样,然后显示小部件。但是当我在函数中显示它时,小部件不会显示。下面是代码(在类中): def比较(自): 进度=比较进度() progress.ui.step.setText(“Schritt 1/3”) progress.ui.progressBar1.setMaximum(4) progress.ui.progressBar1.setValue(1) progre
def比较(自):
进度=比较进度()
progress.ui.step.setText(“Schritt 1/3”)
progress.ui.progressBar1.setMaximum(4)
progress.ui.progressBar1.setValue(1)
progress.ui.progressBar2.setValue(0)
progress.ui.progressBar2.setMaximum(10)
progress.show()
将open(self.ui.csv_c_path.text(),“r”)作为f:
old=f.readlines()
将open(self.ui.csv_path.text(),“r”)作为f:
new=f.readlines()
progress.ui.step.setText(“Schritt 2/3”)
progress.ui.progressBar1.setValue(2)
diff=difflib.ndiff(旧的、新的)
progress.ui.step.setText(“Schritt 3/3”)
progress.ui.progressBar1.setValue(3)
text=“”
x=0
对于枚举中的u,u(差异):
x+=1
progress.ui.progressBar2.setMaximum(x)
#获取新旧csv之间的差异
对于枚举中的i,s(差异):
progress.ui.progressBar2.setValue(i)
如果不是,则s[0]==“”:
text+=s
打印(文本)
message.ui.textEdit.setText(文本)
message.show()
progress.close()
问题在于,您正在执行的任务可能会在GUI线程中消耗大量时间,导致其冻结,因此您必须在新线程中执行该任务,并通过信号更新信息:
导入difflib
从functools导入缓存的_属性
导入线程
从PyQt5导入QtCore、QtWidgets
类工作者(QtCore.QObject):
stepChanged=QtCore.pyqtSignal(int,int)
progressChanged=QtCore.pyqtSignal(int,int)
diffTextChanged=QtCore.pyqtSignal(str)
def启动(自我、文件a、文件b):
穿线,穿线(
目标=自我执行,
args=(
档案室,
档案室,
),
daemon=True,
).start()
定义执行(自我、文件a、文件b):
差异=无
self.stepChanged.emit(1,3)
打开(文件a,“r”)为f1时:
打开(文件_b,“r”)作为f2:
行\u a=f1.readlines()
行_b=f2.readlines()
self.stepChanged.emit(2,3)
diff=difflib.ndiff(行a、行b)
self.stepChanged.emit(3,3)
如果差异为无:
返回
大小=0
text=“”
行=[]
对于大小,枚举中的s(差异,开始=1):
行。追加
self.progressChanged.emit(0,大小)
对于i,枚举中的行(行,开始=1):
self.progressChanged.emit(i,大小)
如果不是第行,则以(“”)开头:
文本+=行
self.diffTextChanged.emit(文本)
类查看器(QtWidgets.QWidget):
def uuu init uuu(self,parent=None):
super()。\uuuu init\uuuu(父级)
lay=qtwidts.QFormLayout(自)
lay.addRow(self.button)
lay.addRow(“输入1”,自线编辑)
lay.addRow(“输入2”,自线编辑)
lay.addRow(“步骤:”,self.stepProgressBar)
lay.addRow(“进度:”,self.valueProgressBar)
lay.addRow(“Diff:,self.textView)
self.button.clicked.connect(self.handle_clicked)
self.worker.stepChanged.connect(self.handle\u step\u changed)
self.worker.progressChanged.connect(self.handle\u progress\u changed)
self.worker.diffTextChanged.connect(self.handle\u diff\u text)
@缓存的不动产
def stepProgressBar(自):
返回qtwidts.QProgressBar(格式=“%m of%v”)
@缓存的不动产
def值进度条(自身):
返回qtwidts.QProgressBar()
@缓存的不动产
def按钮(自身):
返回qtwidts.QPushButton(“开始”)
@缓存的不动产
def textView(自):
返回QtWidgets.QTextEdit(readOnly=True)
@缓存的不动产
def lineedit_a(自身):
返回QtWidgets.QLineEdit()
@缓存的不动产
def lineedit_b(自身):
返回QtWidgets.QLineEdit()
@缓存的不动产
def工作人员(自我):
返回工人()
已单击def句柄(自身):
self.worker.start(self.lineedit_a.text(),self.lineedit_b.text())
def句柄步骤已更改(自身、值、最大值):
self.stepProgressBar.setMaximum(最大值)
self.stepProgressBar.setValue(值)
def句柄_进度_已更改(自身、值、最大值):
self.valueProgressBar.setMaximum(最大值)
self.valueProgressBar.setValue(值)
def句柄差异文本(自身,文本):
self.textView.setText(文本)
def main():
导入系统
app=qtwidts.QApplication(sys.argv)
视图=查看器()
查看。调整大小(640480)
view.show()
sys.exit(app.exec_())
如果名称=“\uuuuu main\uuuuuuuu”:
main()
问题在于,您正在执行的任务可能会在GUI线程中消耗大量时间,导致其冻结,因此您必须在新线程中执行该任务,并通过信号更新信息: 导入difflib 从functools导入缓存的_属性 导入线程 从PyQt5导入QtCore、QtWidgets 类工作者(QtCore.QObject): stepChanged=QtCore.pyqtSignal(int,int) progressChanged=QtCore.pyqtSignal(int,int) diffTextChanged=QtCore.pyqtSignal(str) def启动(自我、文件a、文件b): 穿线,穿线( 目标=自我执行, args=( 档案室, 档案室, ), daemon=True, ).start() 定义执行(自我、文件a、文件b): 差异=无 self.stepChanged.emit(1,3) 打开(文件a,“r”)为f1时: 打开(文件_b,“r”)作为f2: 行\u a=f1.readlines() 线_b=f