簡體   English   中英

用於樹莓派開發的簡單python GUI

[英]Simple python GUI for raspberry pi development

我需要一些幫助來使我的GUI正常運行。 因此對於我的GUI,我需要兩個按鈕和一個計時器。 按下開始/暫停計時器倒數,然后再次按下暫停。 重置其他按鈕應該很容易,就像重置Qtimer一樣。

我試圖使用qtdesigner來確定我的GUI的布局,並且在可行的同時,我似乎無法在其中添加計時器,反之亦然。 (只是不會顯示基於.py文件中哪一個位於較高位置)。 對於計時器,我一直在弄混這個問題PyQt的答案的修改版本-顯示倒數計時器 任何幫助我獲得與按鈕接口一起使用的倒數計時器的幫助都將非常有幫助。

我對代碼進行了一些更改,增加了固定按鈕槽的位置,但仍然無法顯示計時器,但出現錯誤'Ui_Form'對象沒有屬性'setCentralWidget',我無法終生修復。 請有人幫我在gui上獲取計時器,我可以配置該計時器的位置。

import sys
from PyQt5 import QtCore, QtWidgets
#import pymongo
#import socket
#import json
#from time import sleep

DURATION_INT = 300
state = "stopped"
#connection = pymongo.MongoClient(host='192.168.4.2', port=27017)
#db = connection.restdb

class Ui_Form(object):
    def setupUi(self, Form):
        global state
        super().__init__()
        Form.setObjectName("Form")
        Form.resize(648, 561)
        self.pushButton_2 = QtWidgets.QPushButton(Form)
        self.pushButton_2.setGeometry(QtCore.QRect(170, 460, 93, 28))
        self.pushButton_2.setObjectName("pushButton_2")
        self.lineEdit = QtWidgets.QLineEdit(Form)
        self.lineEdit.setGeometry(QtCore.QRect(190, 110, 231, 101))
        self.lineEdit.setObjectName("lineEdit")
        self.lineEdit_2 = QtWidgets.QLineEdit(Form)
        self.lineEdit_2.setGeometry(QtCore.QRect(230, 270, 61, 51))
        self.lineEdit_2.setObjectName("lineEdit_2")
        self.textEdit = QtWidgets.QTextEdit(Form)
        self.textEdit.setGeometry(QtCore.QRect(290, 270, 21, 51))
        self.textEdit.setObjectName("textEdit")
        self.lineEdit_3 = QtWidgets.QLineEdit(Form)
        self.lineEdit_3.setGeometry(QtCore.QRect(310, 270, 61, 51))
        self.lineEdit_3.setObjectName("lineEdit_3")
        self.pushButton = QtWidgets.QPushButton(Form)
        self.pushButton.setGeometry(QtCore.QRect(360, 460, 93, 28))
        self.pushButton.setObjectName("pushButton")
        self.retranslateUi(Form)
        self.pushButton.clicked.connect(self.start_pause)
        self.pushButton_2.clicked.connect(self.reset)
 ######################################################       
        self.time_left_int = DURATION_INT
        self.widget_counter_int = 0

        central_widget = QtWidgets.QWidget()
        self.setCentralWidget(central_widget)
        vbox = QtWidgets.QVBoxLayout()
        central_widget.setLayout(vbox)

        self.pages_qsw = QtWidgets.QStackedWidget()
        vbox.addWidget(self.pages_qsw)
        self.time_passed_qll = QtWidgets.QLabel()
        vbox.addWidget(self.time_passed_qll)

        self.widget_one = QtWidgets.QLabel()
        self.pages_qsw.addWidget(self.widget_one)
        self.timer_start()
        self.update_gui()
#####################################################
    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.pushButton_2.setText(_translate("Form", "Reset"))
        self.pushButton.setText(_translate("Form", "Start/Pause"))

    def timer_start(self):
        self.time_left_int = DURATION_INT
        self.my_qtimer = QtCore.QTimer()
        self.my_qtimer.timeout.connect(self.timer_timeout)
        self.my_qtimer.start(1000)
        self.update_gui()

    def timer_timeout(self):
        self.time_left_int -= 1

        if  self.time_left_int == -1:
            self.widget_counter_int = (self.widget_counter_int + 1) % 4
            self.pages_qsw.setCurrentIndex(self.widget_counter_int)
            self.time_left_int = DURATION_INT

        self.update_gui()

    def update_gui(self):
        self.time_passed_qll.setText(str(self.time_left_int))    

    def start_pause(self):
        global state
        if (state == "stopped" or state == "paused"):
            state = "running"
            print(state)
            #for g in gameData.find():
            #    gameData.update({'_id' : g['_id']}, {'state': state})

        elif (state == "running"):
            state = "paused"
            print(state)
            #for g in gameData.find():
            #    gameData.update({'_id' : g['_id']}, {'state': state})

    def reset(self):
        global state
        state = "stopped"
        print(state)
        #for g in gameData.find():
        #    gameData.update({'_id' : g['_id']}, {'state': state})

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

TL; DR:您似乎沒有完全掌握GUI對象樹(哪些QWidget項連接到哪個QWidget /布局父級)

更改

    Form.setCentralWidget(central_widget)

    self.setCentralWidget(central_widget)

會顯示表格,帶有倒數計時器的標簽位於左下角。 它對按鈕沒有反應,因為帶有標簽和widget_one的QVBoxLayout位於頂部,但至少它倒計時。

您可以使用以下語句為QWidget(或子類)添加背景色:

    pal = QtGui.QPalette()
    pal.setColor(QtGui.QPalette.Background, QtCore.Qt.red)
    self.widget_one.setAutoFillBackground(True)

您會看到手動放置的小部件隨后被隱藏在紅色矩形的后面。 這也意味着widget_one將捕獲所有鼠標事件,並且您無法單擊任何東西。

我建議您不要混合使用setLayout()和setCentralWidget(),因為這將導致鼠標和鍵盤事件發生(有時是非顯而易見的)問題。

總之,我想您想顯示這樣的內容(我已經將QStackedWidget留在其中了,因為我假設您以后要使用它)?

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
#import pymongo
#import socket
#import json
#from time import sleep

DURATION_INT = 300
state = "stopped"
#connection = pymongo.MongoClient(host='192.168.4.2', port=27017)
#db = connection.restdb

class Ui_Form(object):
    def setupUi(self, Form):
        global state
        super().__init__()
        Form.setObjectName("Form")
        Form.resize(648, 561)

 ######################################################       
        self.time_left_int = DURATION_INT
        self.widget_counter_int = 0

        central_widget = QtWidgets.QWidget()
        Form.setCentralWidget(central_widget)
        vbox = QtWidgets.QVBoxLayout()
        central_widget.setLayout(vbox)

        self.time_passed_qll = QtWidgets.QLabel()
        vbox.addWidget(self.time_passed_qll)
        self.time_passed_qll.setAlignment(QtCore.Qt.AlignCenter)
        self.time_passed_qll.setFrameStyle(QtWidgets.QFrame.Panel | QtWidgets.QFrame.Sunken);
        self.time_passed_qll.setTextFormat(QtCore.Qt.RichText) # to be able to use html tags for color!
        self.pages_qsw = QtWidgets.QStackedWidget()


        vbox.addWidget(self.pages_qsw)

        self.widget_one = QtWidgets.QWidget()
        #pal = QtGui.QPalette()
        #pal.setColor(QtGui.QPalette.Background, QtCore.Qt.red)
        #self.widget_one.setAutoFillBackground(True)
        #self.widget_one.setPalette(pal)

        self.pages_qsw.addWidget(self.widget_one)

        self.pushButton_2 = QtWidgets.QPushButton(self.widget_one)
        self.pushButton_2.setGeometry(QtCore.QRect(170, 460, 93, 28))
        self.pushButton_2.setObjectName("pushButton_2")
        self.lineEdit = QtWidgets.QLineEdit(self.widget_one)
        self.lineEdit.setGeometry(QtCore.QRect(190, 110, 231, 101))
        self.lineEdit.setObjectName("lineEdit")
        self.lineEdit_2 = QtWidgets.QLineEdit(self.widget_one)
        self.lineEdit_2.setGeometry(QtCore.QRect(230, 270, 61, 51))
        self.lineEdit_2.setObjectName("lineEdit_2")
        self.textEdit = QtWidgets.QTextEdit(self.widget_one)
        self.textEdit.setGeometry(QtCore.QRect(290, 270, 21, 51))
        self.textEdit.setObjectName("textEdit")
        self.lineEdit_3 = QtWidgets.QLineEdit(self.widget_one)
        self.lineEdit_3.setGeometry(QtCore.QRect(310, 270, 61, 51))
        self.lineEdit_3.setObjectName("lineEdit_3")
        self.pushButton = QtWidgets.QPushButton(self.widget_one)
        self.pushButton.setGeometry(QtCore.QRect(360, 460, 93, 28))
        self.pushButton.setObjectName("pushButton")
        self.retranslateUi(Form)
        self.pushButton.clicked.connect(self.start_pause)
        self.pushButton_2.clicked.connect(self.reset)        

        self.timer_start()
        self.update_gui()
#####################################################
    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.pushButton_2.setText(_translate("Form", "Reset"))
        self.pushButton.setText(_translate("Form", "Start/Pause"))

    def timer_start(self):
        self.time_left_int = DURATION_INT
        self.my_qtimer = QtCore.QTimer()
        self.my_qtimer.timeout.connect(self.timer_timeout)
        self.my_qtimer.start(1000)
        self.update_gui()

    def timer_timeout(self):
        global state
        if state == "running":
            self.time_left_int -= 1

        if  self.time_left_int == -1:
            self.widget_counter_int = (self.widget_counter_int + 1) % 4
            self.pages_qsw.setCurrentIndex(self.widget_counter_int)
            self.time_left_int = DURATION_INT

        self.update_gui()

    def update_gui(self):
        self.time_passed_qll.setText('<p style="color:green;font-size:24px">{}</p>'.format(self.time_left_int))    
        self.lineEdit.setText(str(self.time_left_int))

    def start_pause(self):
        global state
        if (state == "stopped" or state == "paused"):
            state = "running"
            print(state)
            #for g in gameData.find():
            #    gameData.update({'_id' : g['_id']}, {'state': state})

        elif (state == "running"):
            state = "paused"
            print(state)
            #for g in gameData.find():
            #    gameData.update({'_id' : g['_id']}, {'state': state})

    def reset(self):
        global state
        self.time_left_int = DURATION_INT
        state = "stopped"
        print(state)
        #for g in gameData.find():
        #    gameData.update({'_id' : g['_id']}, {'state': state})

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM