Python программа подклассов Окна PyQt5 не может setwindow.title в Function - PullRequest
1 голос
/ 08 марта 2020

У меня есть пример Python программы, которая подклассирует окно PyQt5. Я учу себя и все еще немного новым классам PyQt5 и python.

Программа делает то, что я хочу сделать, я столкнулся с ошибкой, которую я не понимаю, как исправить. Чтобы запустить эту программу как есть, я сейчас учусь запускать Threads. Я импортировал и сабклассировал окно PyQt5. В разделе __init__ подкласса я могу установить заголовок окна, и он отлично работает.

Если я переместу оператор в функцию "def initUI(self):" Я не смогу установить заголовок окна, учтите, у меня есть пробовал разные версии заявления и ничего не работает. Это первая строка определения, и я закомментировал ее.

Мои вопросы:

  1. Является ли это свойство пригодным для определения в определ.

  2. Если это какой-то формат заявления.


from PyQt5.QtCore import pyqtSlot, pyqtSignal
from PyQt5 import QtCore, QtGui, QtWidgets
from Threads import Ui_MainWindow
import sys, time
from time import sleep

class MainWindow_EXEC():
    def __init__(self):             # This section has to be laid out this way 
        app = QtWidgets.QApplication(sys.argv)
        win = QtWidgets.QMainWindow()

        self.ui = Ui_MainWindow()
        self.ui.setupUi(win) 
        self.initUI()               # Inits that need to happen before start up

        win.setWindowTitle("This is the Title!") # Works fine
        win.resize(800,600)
        win.show()  
        sys.exit(app.exec_()) 

    def initUI(self):               # Button assignments
        #self.ui.setWindowTitle("This is the Title!")  # AttributeError: 'Ui_MainWindow' object has no attribute 'setWindowTitle'
        self.ui.btn_Start.clicked.connect(self.start_progressbar)
        self.ui.btn_Stop.clicked.connect(self.stop_progressbar)
        self.ui.btn_Reset.clicked.connect(self.reset_progressbar)
        self.progress_value = 0
        self.stop_progress = False

    def progressbar_counter(self, start_value=0):
        # have to use member: self.run_thread NOT local var: run_thread
        self.run_thread = RunThread(parent=None, counter_start=start_value)
        self.run_thread.start()
        self.run_thread.counter_value.connect(self.get_thread_value)

    def get_thread_value(self, counter):    #This updates the progress bar
        print(counter)
        if not self.stop_progress:
            self.ui.progressBar.setValue(counter)        

    def start_progressbar(self):    # This is the button that starts the progress bar
        self.stop_progress = False  # This is a switch
        self.progress_value = self.ui.progressBar.value()    # Updating the progress bar    
        self.progressbar_counter(self.progress_value)

    def stop_progressbar(self):     # This is a button to stop the progress bar
        self.stop_progress = True
        self.run_thread.stop()

    def reset_progressbar(self):    # This is a button to reset the progress bar
        self.stop_progressbar()
        self.progress_value = 0
        self.stop_progress = False
        self.ui.progressBar.reset()


class RunThread(QtCore.QThread):

    counter_value = QtCore.pyqtSignal(int)                  # define new Signal

    def __init__(self, parent=None, counter_start=0):
        super(RunThread, self).__init__(parent)
        self.counter = counter_start
        self.isRunning = True

    def run(self):
        while self.counter < 100 and self.isRunning == True:
            sleep(0.1)
            self.counter += 1
            print(self.counter)
            self.counter_value.emit(self.counter)     # emit new Signal with value

    def stop(self):
        self.isRunning = False
        print('stopping thread...')
        self.terminate()


if __name__ == "__main__":
    MainWindow_EXEC()

1 Ответ

0 голосов
/ 08 марта 2020

Необходимо различать цели следующих классов:

  • QMainWindow - это виджет, имеющий метод setWindowTitle.
  • Ui_MainWindow - это не виджет, а класс, который используется для заполнить виджет, чтобы у него не было метода setWindowTitle.

Решение состоит в том, чтобы сделать win членом класса, а затем использовать этот объект для изменения заголовка:

class MainWindow_EXEC():
    def __init__(self):             # This section has to be laid out this way 
        app = QtWidgets.QApplication(sys.argv)
        <b>self.win</b> = QtWidgets.QMainWindow()

        self.ui = Ui_MainWindow()
        self.ui.setupUi(<b>self.win</b>) 
        self.initUI() 
        <b>self.win</b>.setWindowTitle("This is the Title!")
        <b>self.win</b>.resize(800,600)
        <b>self.win</b>.show()  
        sys.exit(app.exec_()) 

    def initUI(self):               # Button assignments
        <b>self.win</b>.setWindowTitle("This is the Title!")
        self.ui.btn_Start.clicked.connect(self.start_progressbar)
        # ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...