Python 为什么我的小部件不更新,除非我切换到另一个窗口?

Python 为什么我的小部件不更新,除非我切换到另一个窗口?,python,python-3.x,pyqt,pyqt5,Python,Python 3.x,Pyqt,Pyqt5,所以我才开始使用PyQt5。现在我只编程了一个按钮,它应该从行编辑中获取文本,将其存储在全局变量中,并将其放入文本浏览器中。现在它这样做了。。。但是有一些问题。 在我单击其他程序/窗口,然后再次单击我的应用程序之前,文本浏览器不会更新 当行编辑被清除时,会出现一个错误,基本上是文本没有被正确清除,而只是它的上半部分。当我再次打字时,这个问题就消失了 我尝试为widget和QApplication.process_events()调用.update()方法 这是密码 from PyQt5 impo

所以我才开始使用PyQt5。现在我只编程了一个按钮,它应该从行编辑中获取文本,将其存储在全局变量中,并将其放入文本浏览器中。现在它这样做了。。。但是有一些问题。 在我单击其他程序/窗口,然后再次单击我的应用程序之前,文本浏览器不会更新 当行编辑被清除时,会出现一个错误,基本上是文本没有被正确清除,而只是它的上半部分。当我再次打字时,这个问题就消失了

我尝试为widget和QApplication.process_events()调用.update()方法

这是密码

from PyQt5 import QtCore, QtGui, QtWidgets

lyrics = ''
adlib = ' (Placeholder adlib)'

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(742, 680)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.addLineBtn = QtWidgets.QPushButton(self.centralwidget)
        self.addLineBtn.setGeometry(QtCore.QRect(530, 0, 91, 51))
        font = QtGui.QFont()
        font.setFamily("Arial")
        font.setItalic(True)
        self.addLineBtn.setFont(font)
        self.addLineBtn.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
        self.addLineBtn.setObjectName("addLineBtn")
        self.deleteBtn = QtWidgets.QPushButton(self.centralwidget)
        self.deleteBtn.setGeometry(QtCore.QRect(120, 80, 91, 32))
        self.deleteBtn.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
        self.deleteBtn.setObjectName("deleteBtn")
        self.saveBtn = QtWidgets.QPushButton(self.centralwidget)
        self.saveBtn.setGeometry(QtCore.QRect(30, 80, 91, 32))
        self.saveBtn.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
        self.saveBtn.setObjectName("saveBtn")
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(30, 20, 501, 51))
        self.lineEdit.setObjectName("lineEdit")
        self.dialLabel = QtWidgets.QLabel(self.centralwidget)
        self.dialLabel.setGeometry(QtCore.QRect(640, 20, 71, 16))
        self.dialLabel.setObjectName("dialLabel")
        self.rtdSlider = QtWidgets.QSlider(self.centralwidget)
        self.rtdSlider.setGeometry(QtCore.QRect(620, 40, 101, 22))
        self.rtdSlider.setOrientation(QtCore.Qt.Horizontal)
        self.rtdSlider.setObjectName("rtdSlider")
        self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget)
        self.textBrowser.setGeometry(QtCore.QRect(20, 120, 701, 501))
        self.textBrowser.setObjectName("textBrowser")
        self.noadlibBtn = QtWidgets.QPushButton(self.centralwidget)
        self.noadlibBtn.setGeometry(QtCore.QRect(530, 50, 91, 51))
        font = QtGui.QFont()
        font.setFamily("Arial")
        font.setItalic(True)
        self.noadlibBtn.setFont(font)
        self.noadlibBtn.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
        self.noadlibBtn.setObjectName("noadlibBtn")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 742, 22))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
        self.addLineBtn.clicked.connect(self.addLineAdlib)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.addLineBtn.setText(_translate("MainWindow", "Adlib"))
        self.deleteBtn.setText(_translate("MainWindow", "Delete"))
        self.saveBtn.setText(_translate("MainWindow", "Save"))
        self.dialLabel.setText(_translate("MainWindow", "RTD Level"))
        self.noadlibBtn.setText(_translate("MainWindow", "No Adlib"))

    def addLineAdlib(self):
        global lyrics
        lyrics += self.lineEdit.text() + adlib + '\n'
        self.lineEdit.clear()
        self.textBrowser.setText(lyrics)
    def addLineNoAdlib(self):
        pass

    def save(self):
        pass

    def deleteLine(self):
        pass


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

1. <代码>在我单击其他程序/窗口,然后再次单击我的应用程序之前,文本浏览器不会更新-此问题可能与您的操作系统有关。我在Ubuntu16.04上有不正确的PyQT5行为,而在Ubuntu18.04上一切正常。你能分享更多信息吗?
注意:我在Ubuntu 18.04上测试了你的脚本,我不需要点击其他程序/窗口来刷新它

2. <代码>当行编辑被清除时,有一个错误,基本上是文本没有被正确清除,但只是它的上半部分。当我再次打字时,这会消失。-你能解释一下你所说的
它是上半部分是什么意思吗?如果您的意思是仍然有
(占位符adlib)
文本,则在向变量添加内容之前,应修改函数以选中
lineEdit
文本框。例如,像这样:

def addLineAdlib(self):
        if self.lineEdit.text():
                global lyrics
                lyrics += self.lineEdit.text() + adlib + '\n'
                self.lineEdit.clear()
                self.textBrowser.setText(lyrics)

1. <代码>在我单击其他程序/窗口,然后再次单击我的应用程序之前,文本浏览器不会更新
-此问题可能与您的操作系统有关。我在Ubuntu16.04上有不正确的PyQT5行为,而在Ubuntu18.04上一切正常。你能分享更多信息吗?
注意:我在Ubuntu 18.04上测试了你的脚本,我不需要点击其他程序/窗口来刷新它

2. <代码>当行编辑被清除时,有一个错误,基本上是文本没有被正确清除,但只是它的上半部分。当我再次打字时,这会消失。-你能解释一下你所说的
它是上半部分是什么意思吗?如果您的意思是仍然有
(占位符adlib)
文本,则在向变量添加内容之前,应修改函数以选中
lineEdit
文本框。例如,像这样:

def addLineAdlib(self):
        if self.lineEdit.text():
                global lyrics
                lyrics += self.lineEdit.text() + adlib + '\n'
                self.lineEdit.clear()
                self.textBrowser.setText(lyrics)

这是一个更干净、更具类化(更具pythonic pyqt)的程序版本,我把注释掉了,让您看看它会在哪里,但我删除了您的坐标系,并用创建GUI的更标准的布局样式替换了它

我在win10上使用Python3.7 pyqt5测试了这一点,因此,如果存在操作系统问题,您将知道这一点,但我的猜测(不必深入到那难看的混乱中)是,在某些地方出现了断开连接,这导致了您遇到的问题

此外,您设计的按钮永远不会创建一个空行,因为它总是在一行上放一些东西——我通过单击按钮而不输入任何内容来测试这一点

from sys import exit as sysExit

from PyQt5.QtCore import Qt
from PyQt5.QtGui  import QFont, QCursor
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QHBoxLayout, QVBoxLayout, QDockWidget, QStyleFactory
from PyQt5.QtWidgets import QPushButton, QLineEdit, QLabel, QSlider, QTextBrowser, QMenuBar, QStatusBar

class MenuToolBar(QDockWidget):
    def __init__(self, MainWin):
        QDockWidget.__init__(self)
        self.MainWin = MainWin
        self.MainMenu = MainWin.menuBar()

        # ******* Create the Help Menu *******
        self.HelpMenu  = self.MainMenu.addMenu('Help')

class CenterPanel(QWidget):
    def __init__(self, parent):
        QWidget.__init__(self)

    # General Font Object for a couple of Buttons
        btnFont = QFont()
        btnFont.setFamily('Arial')
        btnFont.setItalic(True)

    # First Item Horizontal Box 1 Containing the AddLib Entry and Button
        self.lnAdlibEntry = QLineEdit(self)
#        self.lnAdlibEntry.setGeometry(QRect(30, 20, 501, 51))
#        self.lnAdlibEntry.resize(501, 51)

        self.btnAddLine = QPushButton(self)
#                                       Left, Top, Width, Height
#        self.btnAddLine.setGeometry(QRect(530, 0, 91, 51))
#                            Width, Height
#        self.btnAddLine.resize(91, 51)
        self.btnAddLine.setFont(btnFont)
        self.btnAddLine.setCursor(QCursor(Qt.PointingHandCursor))
        self.btnAddLine.setText('Adlib')
        self.btnAddLine.clicked.connect(parent.AddLineAdlib)

        HBox1 = QHBoxLayout()
        HBox1.addWidget(self.lnAdlibEntry)
        HBox1.addWidget(self.btnAddLine)

    # Second Item Vertical Box 1 Containing the AdlibEntry LineEdit and RTD Label and RTD Slider

        self.lblDial = QLabel(self)
#        self.lblDial.setGeometry(QRect(640, 20, 71, 16))
#        self.lblDial.resize(71, 16)
        self.lblDial.setText("RTD Level")

        self.sldrRtd = QSlider(self)
#        self.sldrRtd.setGeometry(QRect(620, 40, 101, 22))
#        self.sldrRtd.resize(101, 22)
        self.sldrRtd.setOrientation(Qt.Horizontal)

        VBox1 = QVBoxLayout()
        VBox1.addWidget(self.lblDial)
        VBox1.addWidget(self.sldrRtd)

    # Third Item Horizontal Box 2 containing the Save, No Adlib and Delete buttons
        self.btnNoAdlib = QPushButton(self)
#        self.btnNoAdlib.setGeometry(QRect(530, 50, 91, 51))
#        self.btnNoAdlib.resize(91, 51)
        self.btnNoAdlib.setFont(btnFont)
        self.btnNoAdlib.setCursor(QCursor(Qt.PointingHandCursor))
        self.btnNoAdlib.setText("No Adlib")

        self.btnSave = QPushButton(self)
#        self.btnSave.setGeometry(QRect(30, 80, 91, 32))
#        self.btnSave.resize(91, 32)
        self.btnSave.setCursor(QCursor(Qt.PointingHandCursor))
        self.btnSave.setText('Save')

        self.btnDelete = QPushButton(self)
#        self.btnDelete.setGeometry(QRect(120, 80, 91, 32))
#        self.btnDelete.resize(91, 32)
        self.btnDelete.setCursor(QCursor(Qt.PointingHandCursor))
        self.btnDelete.setText('Delete')

        HBox2 = QHBoxLayout()
        HBox2.addWidget(self.btnSave)
        HBox2.addStretch(1)
        HBox2.addWidget(self.btnNoAdlib)
        HBox2.addStretch(1)
        HBox2.addWidget(self.btnDelete)

    # Sixth Item Text Browser
        self.txtBrowser = QTextBrowser(self)
#        self.txtBrowser.setGeometry(QRect(20, 120, 701, 501))
#        self.txtBrowser.resize(701, 501)

        VBox2 = QVBoxLayout()
        VBox2.addLayout(HBox1)
        VBox2.addLayout(VBox1)
        VBox2.addLayout(HBox2)
        VBox2.addWidget(self.txtBrowser)

        self.setLayout(VBox2)

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.Lyrics = ''
        self.Adlib = ' (Placeholder adlib)'

        self.setWindowTitle('Main Window')
        self.resize(742, 680)

        self.CenterPane = CenterPanel(self)
        self.setCentralWidget(self.CenterPane)

        self.MenuBar = MenuToolBar(self)
#        self.MenuBar.setGeometry(QRect(0, 0, 742, 22))

        self.SetStatusBar(self)
        self.setStyle(QStyleFactory.create('Cleanlooks'))

    def SetStatusBar(self, parent):
        StatusMsg = ''
        parent.StatBar = parent.statusBar()

        if len(StatusMsg) < 1:
            StatusMsg = 'Ready'

        parent.StatBar.showMessage(StatusMsg)

    def AddLineAdlib(self):
      # This statement retains everything previously in Lyrics and 
      # everything in the AdlibEntry box and everything in Adlib which
      # I am not sure is what you are wanting but it is what you had
        self.Lyrics += self.CenterPane.lnAdlibEntry.text() + self.Adlib + '\n'
        self.CenterPane.lnAdlibEntry.clear()
        self.CenterPane.txtBrowser.setText(self.Lyrics)

    def AddLineNoAdlib(self):
        pass

    def Save(self):
        pass

    def DeleteLine(self):
        pass

if __name__ == "__main__":
    MainThred = QApplication([])

    MainGUI = MainWindow()
    MainGUI.show()

    sysExit(MainThred.exec_())
从sys导入退出为sysExit
从PyQt5.QtCore导入Qt
从PyQt5.QtGui导入QFont、QCursor
从PyQt5.QtWidgets导入QApplication、QMainWindow、QWidget、QHBoxLayout、QVBoxLayout、QDockWidget、QStyleFactory
从PyQt5.QtWidgets导入QPushButton、QLineEdit、QLabel、QSlider、QTextBrowser、QMenuBar、QStatusBar
类菜单工具栏(QDockWidget):
def _;初始化__;(自我,MainWin):
QDockWidget.\uuuuu初始化\uuuuuuuu(自)
self.MainWin=MainWin
self.MainMenu=MainWin.menuBar()
#*******创建“帮助”菜单*******
self.HelpMenu=self.MainMenu.addMenu('Help'))
类中心面板(QWidget):
定义初始化(自身,父级):
QWidget.\uuuuu初始化(自)
#几个按钮的常规字体对象
btnFont=QFont()
btnFont.setFamily('Arial')
btnFont.setItalic(真)
#包含AddLib条目和按钮的第一项水平框1
self.lnAdlibEntry=QLineEdit(self)
#self.lnAdlibEntry.setGeometry(QRect(30,20501,51))
#self.lnAdlibEntry.resize(501,51)
self.btnAddLine=QPushButton(self)
#左、上、宽、高
#self.btnAddLine.setGeometry(QRect(530,0,91,51))
#宽度、高度
#self.btnAddLine.resize(91,51)
self.btnAddLine.setFont(btnFont)
self.btnAddLine.setCursor(QCursor(Qt.PointingHandCursor))
self.btnAddLine.setText('Adlib')
self.btnAddLine.clicked.connect(parent.AddLineAdlib)
HBox1=QHBoxLayout()
HBox1.addWidget(self.lnAdlibEntry)
HBox1.addWidget(self.btnAddLine)
#第二项垂直框1,包含AdlibEntry LineEdit和RTD标签以及RTD滑块
self.lblDial=QLabel(self)
#自二进制集合几何(QRect(640,20,71,16))
#self.lblDial.resize(71,16)
self.lblDial.setText(“RTD级别”)
self.sldrRtd=QSlider(self)
#self.sldrRtd.setGeometry(QRect(620、40、101、22))
#self.sldrRtd.resize(101,22)
self.sldrRtd.setOrientation(Qt.水平)
VBox1=QVBoxLayout()
VBox1.addWidget(self.lblDial)
VBox1.addWidget(self.sldrRtd)
#第三项水平框2,包含保存、无即兴和删除按钮
self.btnNoAdlib=QPushButton(self)
#self.btnNoAdlib.setGeometry(QRect(530,50,91,51))
#self.btnNoAdlib.resize(91,51)
self.btnNoAdlib.setFont(btnFont)
self.btnNoAdlib.setCursor(QCursor(Qt.PointingHandCursor))
self.btnNoAdlib.setText(“无Adlib”)
self.btnSave=QPushButton(self)
#self.btnSave.setGeometry(QRect(30,80,91,32))
#self.btnSave.resize(91,32)
self.btnSave.setCursor(QCursor(Qt.PointingHandCursor))
self.btnSave.setText('Save')
self.btnDelete=QPushButton(self)
#自删除设置几何体(QRect(120,80,9