亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python PyQt5的窗口界面的各種交互邏輯實(shí)現(xiàn)

 更新時(shí)間:2024年07月17日 10:28:21   作者:景天科技苑  
PyQt5是一個(gè)Python綁定庫(kù),用于Qt C++ GUI框架,它允許開發(fā)者使用Python語(yǔ)言創(chuàng)建跨平臺(tái)的應(yīng)用程序,并利用豐富的Qt圖形用戶界面功能,本文介紹了python中PyQt5窗口界面的各種交互邏輯實(shí)現(xiàn),需要的朋友可以參考下

PyQt5窗口交互

在PyQt5中,可以使用信號(hào)和槽來(lái)處理控件的交互狀態(tài)。
常見API如下所示

在這里插入圖片描述

1. 控件狀態(tài)

控件狀態(tài)表明了這個(gè)控件是否是可用的,比如一個(gè)按鈕,通常使用灰色來(lái)表示為不可點(diǎn)擊。在pyQt中,可以通過(guò)setEnabled()函數(shù)來(lái)設(shè)置控件的使能狀態(tài),以下代碼繪制了一個(gè)無(wú)法被點(diǎn)擊的按鈕:

# 0. 導(dǎo)入需要的包和模塊
from PyQt5.Qt import *  # 主要包含了我們常用的一些類, 匯總到了一塊
import sys


# 1. 創(chuàng)建一個(gè)應(yīng)用程序?qū)ο?
app = QApplication(sys.argv)


# 2. 控件的操作
# 2.1 創(chuàng)建控件
window = QWidget()


# 2.2 設(shè)置控件
#設(shè)置窗口標(biāo)題,默認(rèn)標(biāo)題是python,只有頂級(jí)控件才可以設(shè)置標(biāo)題欄的標(biāo)題
window.setWindowTitle("窗口是否可用")
#設(shè)置窗口大小,注意,設(shè)置的空間尺寸大小,不包含上面的標(biāo)題欄
window.resize(500, 500)


#創(chuàng)建個(gè)子控件
btn = QPushButton(window)
btn.setText("按鈕")
btn.move(100,100)


#設(shè)置信號(hào)與槽
btn.pressed.connect(lambda :print("按鈕被點(diǎn)擊了"))


#查看按鈕是否可用
print(btn.isEnabled())

#設(shè)置按鈕不可用
btn.setEnabled(False)

#查看按鈕是否可用
print("設(shè)置后",btn.isEnabled())


# 2.3 展示控件
window.show()



# 3. 應(yīng)用程序的執(zhí)行, 進(jìn)入到消息循環(huán)
sys.exit(app.exec_())

運(yùn)行,可見設(shè)置按鈕不可用之前,按鈕狀態(tài)是可用的。設(shè)置之后,按鈕是灰色的,不可點(diǎn)擊

在這里插入圖片描述

2. 控件可視化

在這里插入圖片描述

只有窗口被繪制,才會(huì)被顯示出來(lái)

可以通過(guò)setVisible()來(lái)設(shè)置一個(gè)控件是否可視,以下代碼創(chuàng)建一個(gè)按鍵,但是設(shè)置為不可視:
setVisible()傳遞的參數(shù)值為True也不一定可見,主要還要看父控件的可見性
setHidden(bool) show() hide() 本質(zhì)上還是調(diào)用了setVisible()方法

如下代碼展示了,當(dāng)調(diào)用了窗口對(duì)象show方法,就會(huì)觸發(fā)繪制事件

# 0. 導(dǎo)入需要的包和模塊
from PyQt5.Qt import *  # 主要包含了我們常用的一些類, 匯總到了一塊
import sys


# 1. 創(chuàng)建一個(gè)應(yīng)用程序?qū)ο?
app = QApplication(sys.argv)


class Window(QWidget):
    #窗口繪制時(shí),觸發(fā)該事件
    def paintEvent(self, evt):
        print("窗口被繪制了")
        #重寫了父類方法,由于我們不做繪制邏輯,讓父類方法繪制,所以將父類繪制方法返回
        return super().paintEvent(evt)






# 2. 控件的操作
# 2.1 創(chuàng)建控件
window = Window()


# 2.2 設(shè)置控件
#設(shè)置窗口標(biāo)題,默認(rèn)標(biāo)題是python,只有頂級(jí)控件才可以設(shè)置標(biāo)題欄的標(biāo)題
window.setWindowTitle("控件可視化")
#設(shè)置窗口大小,注意,設(shè)置的空間尺寸大小,不包含上面的標(biāo)題欄
window.resize(500, 500)



# 2.3 展示控件
window.show()



# 3. 應(yīng)用程序的執(zhí)行, 進(jìn)入到消息循環(huán)
sys.exit(app.exec_())

運(yùn)行

在這里插入圖片描述

當(dāng)我們將show方法注釋,繪制事件就不會(huì)被觸發(fā)

在這里插入圖片描述

此時(shí),我們使用setVisible()方法,依然會(huì)觸發(fā)繪制事件

#設(shè)置窗口可見
window.setVisible(True)

在這里插入圖片描述

使用setHidden()方法設(shè)置窗口可見性

window.setHidden(False)

在這里插入圖片描述

窗口繪制的時(shí)候,先繪制主窗口,再繪制子控件

# 0. 導(dǎo)入需要的包和模塊
from PyQt5.Qt import *  # 主要包含了我們常用的一些類, 匯總到了一塊
import sys


# 1. 創(chuàng)建一個(gè)應(yīng)用程序?qū)ο?
app = QApplication(sys.argv)


class Window(QWidget):
    #窗口繪制時(shí),觸發(fā)該事件
    def paintEvent(self, evt):
        print("窗口被繪制了")
        #重寫了父類方法,由于我們不做繪制邏輯,讓父類方法繪制,所以將父類繪制方法返回
        return super().paintEvent(evt)


class Btn(QPushButton):
    def paintEvent(self, evt):
        print("按鈕被繪制了")
        #重寫了父類方法,由于我們不做繪制邏輯,讓父類方法繪制,所以將父類繪制方法返回
        return super().paintEvent(evt)




# 2. 控件的操作
# 2.1 創(chuàng)建控件
window = Window()


# 2.2 設(shè)置控件
#設(shè)置窗口標(biāo)題,默認(rèn)標(biāo)題是python,只有頂級(jí)控件才可以設(shè)置標(biāo)題欄的標(biāo)題
window.setWindowTitle("控件可視化")
#設(shè)置窗口大小,注意,設(shè)置的空間尺寸大小,不包含上面的標(biāo)題欄
window.resize(500, 500)


#創(chuàng)建按鈕
btn = Btn(window)
btn.setText("按鈕")



# 2.3 展示控件
# window.show()

#設(shè)置窗口可見
# window.setVisible(True)
window.setHidden(False)

# 3. 應(yīng)用程序的執(zhí)行, 進(jìn)入到消息循環(huán)
sys.exit(app.exec_())

運(yùn)行可以看到,先繪主窗口,再繪制子控件 按鈕

在這里插入圖片描述

我們也可以設(shè)置當(dāng)我們點(diǎn)擊按鈕時(shí),隱藏按鈕

btn.pressed.connect(lambda :btn.hide())

在這里插入圖片描述

控制控件的顯示和隱藏的本質(zhì)是控制該控件是否被繪制

判定控件是否隱藏

在這里插入圖片描述

isHidden() 判斷控件是否設(shè)置了隱藏,如果沒有設(shè)置隱藏,即使父控件不可見,該值獲得的結(jié)果依然是 沒有隱藏

在這里插入圖片描述

isVisibleTo(widget)
如果能隨著widget控件的顯示和隱藏, 而同步變化, 則返回True

在這里插入圖片描述

3.控件是否被編輯

在這里插入圖片描述

代碼展示:

# 0. 導(dǎo)入需要的包和模塊
from PyQt5.Qt import *  # 主要包含了我們常用的一些類, 匯總到了一塊
import sys


# 1. 創(chuàng)建一個(gè)應(yīng)用程序?qū)ο?
app = QApplication(sys.argv)


# 2. 控件的操作
# 2.1 創(chuàng)建控件
window = QWidget()


# 2.2 設(shè)置控件
#設(shè)置窗口標(biāo)題,默認(rèn)標(biāo)題是python,只有頂級(jí)控件才可以設(shè)置標(biāo)題欄的標(biāo)題
window.setWindowTitle("編輯窗口[*]")
#設(shè)置窗口大小,注意,設(shè)置的空間尺寸大小,不包含上面的標(biāo)題欄
window.resize(500, 500)


#設(shè)置窗口是被編輯狀態(tài)
window.setWindowModified(True)

# 2.3 展示控件
window.show()



# 3. 應(yīng)用程序的執(zhí)行, 進(jìn)入到消息循環(huán)
sys.exit(app.exec_())

設(shè)置被編輯狀態(tài),標(biāo)題欄顯示個(gè)星星

在這里插入圖片描述

當(dāng)沒有設(shè)置為編輯狀態(tài),不顯示星星

在這里插入圖片描述

判斷窗口是否處于被編輯狀態(tài)

#獲取窗口是否處于被編輯狀態(tài)
print(window.isWindowModified())

在這里插入圖片描述

4.控件的關(guān)閉

具體API
window.close() #這種起始只是隱藏了按鈕
setAttribute(Qt.WA_DeleteOnClose, True) #當(dāng)設(shè)置了這個(gè)屬性,設(shè)置按鈕關(guān)閉時(shí),就會(huì)釋放按鈕

只是關(guān)閉按鈕,并不會(huì)觸發(fā)destroyed事件

在這里插入圖片描述

#設(shè)置屬性
btn.setAttribute(Qt.WA_DeleteOnClose, True)

此時(shí),關(guān)閉按鈕,就會(huì)釋放

在這里插入圖片描述

5.控件交互綜合案例

創(chuàng)建一個(gè)窗口, 包含一個(gè)文本框和一個(gè)按鈕和一個(gè)標(biāo)簽
默認(rèn)狀態(tài)
標(biāo)簽隱藏
文本框和按鈕顯示
按鈕設(shè)置為不可用狀態(tài)

當(dāng)文本框有內(nèi)容時(shí), 讓按鈕可用, 否則不可用
當(dāng)文本框內(nèi)容為jingtian時(shí), 點(diǎn)擊按鈕則顯示標(biāo)簽, 并展示文本為登錄成功;否則為失敗

代碼展示

from PyQt5.Qt import *

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("交互狀態(tài)案例的學(xué)習(xí)")
        self.resize(500, 500)
        self.setup_ui()

    def setup_ui(self):
        # 添加三個(gè)子控件
        label = QLabel(self)
        label.setText("標(biāo)簽")
        label.move(100, 50)
        #默認(rèn)讓標(biāo)簽隱藏
        label.hide()

        #輸入文本框
        le = QLineEdit(self)
        # le.setText("文本框")
        le.move(100, 100)

        btn = QPushButton(self)
        btn.setText("登錄")
        btn.move(100, 150)
        btn.setEnabled(False)

        #參數(shù)值就是輸入的內(nèi)容
        def text_cao(text):
            print("文本內(nèi)容發(fā)生了改變", text)
            # if len(text) > 0:
            #     btn.setEnabled(True)
            # else:
            #     btn.setEnabled(False)
            btn.setEnabled(len(text) > 0)
        #文件改變事件
        le.textChanged.connect(text_cao)

        def check():
            # print("按鈕被點(diǎn)擊了")
            # 1. 獲取文本框內(nèi)容
            content = le.text()
            # 2. 判定是否是jingtian
            if content == "jingtian":
                # 3. 是 -> 顯示之前隱藏的提示標(biāo)簽, 展示文本
                label.setText("登錄成功")
            else:
                label.setText("登錄失敗")

            #顯示標(biāo)簽內(nèi)容
            label.show()
            #設(shè)置標(biāo)簽尺寸自適應(yīng)
            label.adjustSize()

        #點(diǎn)擊登錄按鈕時(shí)觸發(fā)
        btn.pressed.connect(check)


if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)

    window = Window()
    window.show()


    sys.exit(app.exec_())

運(yùn)行,當(dāng)沒有輸入時(shí),按鈕是不可用狀態(tài)

在這里插入圖片描述

輸入jigntian,點(diǎn)擊登錄,顯示登錄成功

在這里插入圖片描述

輸入其他內(nèi)容,點(diǎn)擊登錄,顯示登錄失敗

在這里插入圖片描述

6.控件信息提示

一些控件當(dāng)我們光標(biāo)停留在上面的時(shí)候,會(huì)顯示一個(gè)小框文本來(lái)提示。
提示大致分為三種,具體如下圖所示

在這里插入圖片描述

代碼展示

# 0. 導(dǎo)入需要的包和模塊
from PyQt5.Qt import *
import sys


# 1. 創(chuàng)建一個(gè)應(yīng)用程序?qū)ο?
app = QApplication(sys.argv)

# 2. 控件的操作
# 2.1 創(chuàng)建控件
# window = QWidget()
#創(chuàng)建主窗口,里面的子控件懶加載
window = QMainWindow()
# 懶加載
# 用到的時(shí)候, 才會(huì)創(chuàng)建
window.statusBar() #設(shè)置狀態(tài)欄

# 2.2 設(shè)置控件
window.setWindowTitle("信息提示")
window.resize(500, 500)

#把窗口模式改成帶問(wèn)號(hào)的,窗口上下文幫助按鈕
window.setWindowFlags(Qt.WindowContextHelpButtonHint)

# 當(dāng)鼠標(biāo)停留在窗口控件身上之后, 在狀態(tài)欄提示的一段文本
window.setStatusTip("這是窗口")

#獲取狀態(tài)欄提示
print(window.statusTip())

label = QLabel(window)
label.setText("社會(huì)我景天哥")
#鼠標(biāo)放在標(biāo)簽上時(shí),觸發(fā)狀態(tài)欄顯示相關(guān)內(nèi)容
label.setStatusTip("這是標(biāo)簽")

#設(shè)置工具欄提示,鼠標(biāo)放到標(biāo)簽上時(shí),直接在旁邊提示
label.setToolTip("這是一個(gè)提示標(biāo)簽")
#獲取工具欄提示
print(label.toolTip())

#設(shè)置工具欄提示時(shí)長(zhǎng)
label.setToolTipDuration(2000)
print(label.toolTipDuration())

#鼠標(biāo)變成一個(gè)問(wèn)號(hào)時(shí),點(diǎn)擊鼠標(biāo)顯示設(shè)置內(nèi)容
label.setWhatsThis("這是啥? 這是標(biāo)簽")


# 2.3 展示控件
window.show()
# 3. 應(yīng)用程序的執(zhí)行, 進(jìn)入到消息循環(huán)
sys.exit(app.exec_())

當(dāng)鼠標(biāo)放在窗口上,狀態(tài)欄顯示

在這里插入圖片描述

當(dāng)鼠標(biāo)放在標(biāo)簽上,狀態(tài)欄和工具欄顯示

在這里插入圖片描述

當(dāng)設(shè)置窗口模式,讓鼠標(biāo)變成問(wèn)號(hào),點(diǎn)擊標(biāo)簽時(shí)顯示

在這里插入圖片描述

7.窗口焦點(diǎn)控制

當(dāng)窗口中有多個(gè)控件時(shí),鼠標(biāo)焦點(diǎn)可能會(huì)聚焦到不同控件
焦點(diǎn)我們可以用鼠標(biāo)點(diǎn)擊,也可以按tab鍵切換
焦點(diǎn)在哪里,鍵盤輸入就輸入到哪里
只有獲取焦點(diǎn)的控件,才能與用戶交互

在這里插入圖片描述

代碼展示

# 0. 導(dǎo)入需要的包和模塊
from PyQt5.Qt import *
import sys

#繼承,重寫鼠標(biāo)監(jiān)聽
class Window(QWidget):
    def mousePressEvent(self, evt):
        print("動(dòng)態(tài)監(jiān)聽打印獲取焦點(diǎn)的空間",self.focusWidget())
        #點(diǎn)擊鼠標(biāo),焦點(diǎn)聚焦到下一個(gè)子控件
        # self.focusNextChild()
        #點(diǎn)擊鼠標(biāo),焦點(diǎn)聚焦到上一個(gè)子控件
        # self.focusPreviousChild()
        #點(diǎn)擊鼠標(biāo),焦點(diǎn)聚焦到下一個(gè)子控件 True是聚焦到下一個(gè)子控件,F(xiàn)alse是聚焦到上一個(gè)子控件
        # self.focusNextPrevChild(True)

# 1. 創(chuàng)建一個(gè)應(yīng)用程序?qū)ο?
app = QApplication(sys.argv)

# 2. 控件的操作
# 2.1 創(chuàng)建控件
window = Window()
# 2.2 設(shè)置控件
window.setWindowTitle("焦點(diǎn)控制")
window.resize(500, 500)


le1 = QLineEdit(window)
le1.move(50, 50)

le2 = QLineEdit(window)
le2.move(100, 100)

le3 = QLineEdit(window)
le3.move(150, 150)

#設(shè)置子控件,按下tab鍵獲取焦點(diǎn)的順序
#setTabOrder是靜態(tài)方法,直接用類來(lái)調(diào)用
Window.setTabOrder(le1, le3)
Window.setTabOrder(le3, le2)

#人為設(shè)置初始的焦點(diǎn)位置
# le2.setFocus()

#設(shè)置獲取焦點(diǎn)的方式
# le2.setFocusPolicy(Qt.TabFocus) #通過(guò)tab獲取焦點(diǎn)
# le2.setFocusPolicy(Qt.ClickFocus) #通過(guò)鼠標(biāo)點(diǎn)擊獲取焦點(diǎn)
# le2.setFocusPolicy(Qt.StrongFocus)  #可以通過(guò)鼠標(biāo)和tab鍵獲取焦點(diǎn),默認(rèn)是這種方式
# le2.setFocusPolicy(Qt.NoFocus)  #不能通過(guò)鼠標(biāo)和tab鍵獲取焦點(diǎn),但可以通過(guò)setFocus仍可使其獲得焦點(diǎn)

# le2.setFocus()

#取消焦點(diǎn),這個(gè)一般配合setFocus()使用
# le2.clearFocus()




# 2.3 展示控件
window.show()

# print(le1)
# print(le2)
# print(le3)
#
# le2.setFocus()

# 獲取當(dāng)前窗口內(nèi)部, 所有子控件當(dāng)中獲取焦點(diǎn)的那個(gè)控件
#要獲取到,必須通過(guò)設(shè)置哪個(gè)控件獲取焦點(diǎn),才能獲取到,如果沒有設(shè)置,獲取到的是None
print("獲取當(dāng)前光標(biāo)聚焦的子控件",window.focusWidget())

# le1.clearFocus()

# 3. 應(yīng)用程序的執(zhí)行, 進(jìn)入到消息循環(huán)
sys.exit(app.exec_())

按tab切換光標(biāo)焦點(diǎn)

在這里插入圖片描述

當(dāng)然,根據(jù)設(shè)置,點(diǎn)擊鼠標(biāo)也可以切換光標(biāo)

以上就是python中PyQt5窗口界面的各種交互邏輯實(shí)現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于python PyQt5窗口交互的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python設(shè)計(jì)模式編程中解釋器模式的簡(jiǎn)單程序示例分享

    Python設(shè)計(jì)模式編程中解釋器模式的簡(jiǎn)單程序示例分享

    這篇文章主要介紹了Python設(shè)計(jì)模式編程中解釋器模式的簡(jiǎn)單程序示例分享,解釋器模式強(qiáng)調(diào)用抽象類來(lái)表達(dá)程序中將要實(shí)現(xiàn)的功能,需要的朋友可以參考下
    2016-03-03
  • python 顯示數(shù)組全部元素的方法

    python 顯示數(shù)組全部元素的方法

    下面小編就為大家分享一篇python 顯示數(shù)組全部元素的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • python斐波那契數(shù)列的計(jì)算方法

    python斐波那契數(shù)列的計(jì)算方法

    這篇文章主要為大家詳細(xì)介紹了python斐波那契數(shù)列的計(jì)算方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • python中創(chuàng)建和修改yaml文件的方法

    python中創(chuàng)建和修改yaml文件的方法

    YAML 是 "YAML Ain’t a Markup Language"的遞歸縮寫,yaml簡(jiǎn)潔美觀,是一種常用的標(biāo)記語(yǔ)言,可以用來(lái)表達(dá)多種數(shù)據(jù)結(jié)構(gòu)和配置文件,本文給大家介紹python中如何創(chuàng)建和修改yaml文件,感興趣的朋友一起看看吧
    2023-11-11
  • numpy中的ndarray方法和屬性詳解

    numpy中的ndarray方法和屬性詳解

    這篇文章主要介紹了numpy中的ndarray方法和屬性詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-05-05
  • python區(qū)分不同數(shù)據(jù)類型的方法

    python區(qū)分不同數(shù)據(jù)類型的方法

    這篇文章主要介紹了python區(qū)分不同數(shù)據(jù)類型的方法實(shí)例以及相關(guān)知識(shí)點(diǎn),需要的朋友們學(xué)習(xí)下。
    2019-10-10
  • Python 音視頻剪輯快速入門教程

    Python 音視頻剪輯快速入門教程

    MoviePy 是一個(gè)用于視頻編輯的 Python 模塊,可用于進(jìn)行視頻的基本操作(如剪切、拼接、標(biāo)題插入)、視頻合成(也稱非線性編輯)、視頻處理或創(chuàng)建高級(jí)效果。這篇文章主要介紹了用 Python 快速入門音視頻剪輯,需要的朋友可以參考下
    2021-09-09
  • pandas將numpy數(shù)組寫入到csv的實(shí)例

    pandas將numpy數(shù)組寫入到csv的實(shí)例

    今天小編就為大家分享一篇pandas將numpy數(shù)組寫入到csv的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • 基于SQLAlchemy實(shí)現(xiàn)操作MySQL并執(zhí)行原生sql語(yǔ)句

    基于SQLAlchemy實(shí)現(xiàn)操作MySQL并執(zhí)行原生sql語(yǔ)句

    這篇文章主要介紹了基于SQLAlchemy實(shí)現(xiàn)操作MySQL并執(zhí)行原生sql語(yǔ)句,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Python log模塊logging記錄打印用法解析

    Python log模塊logging記錄打印用法解析

    這篇文章主要介紹了Python log模塊logging記錄打印用法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01

最新評(píng)論