PyQt常用控件的使用:QFileDialog、QMessageBox、QTreeWidget、QRadioButton等

文章目錄

  • 一、控件常用函數介紹
  • 二、QFileDialog(文件類操作)
  • 三、QMessageBox(對話框)
  • 四、QTreeWidget(樹結構類操作)
    • 4.1 樹結構的初始化
    • 4.2 遞歸讀取完整樹結構
    • 4.3 兩QTreeWidget滑輪同步滑動
    • 4.4 信號槽綁定
  • 五、QCombox改寫下拉多勾選框
  • 六、QRadioButton(單選按鈕控件)
  • 七、QTextEdit(多行文本框)

一、控件常用函數介紹

常用函數

函數功能
setText(txt)設置內容
text()獲取內容
setEnabled(bool)使按鈕失效
setCheckable(bool)設置為可選狀態
setChecked(bool)設置按鈕狀態
(如果是按鈕需要先設置setCheckable狀態)
isChecked()獲取按鈕狀態
(如果是按鈕則需要先設置setCheckable狀態)
setIcon(QIcon(QPixmap(“icon.jpg”)))設置圖標
setIconSizeQSize(100, 100)設置圖標的大小
setShortcut(“Alt+O”)設置快捷鍵
setStyleSheet(“x:x;x:x;”)設置樣式(CSS)
setToolTip(text)設置氣泡(懸停提示)

常見事件綁定函數

函數功能
clicked.connect()按鈕單擊(QPushButton, QRadioButton)
currentIndexChanged.connect()下拉框內容變化(QComboBox)
triggered.connect()菜單鍵點擊(QAction)
setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
customContextMenuRequested.connect()
選項右擊(QTreeWidget,自帶參數pos)

部分函數默認自帶參數,如果要額外帶些參數,編寫方式如下

self.tree_widget.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.tree_widget.customContextMenuRequested.connect(lambda pos: self.right_clicked_tree(pos, "abc"))# pos為自帶參數,txt為自定義參數
def right_clicked_tree(self, pos, txt):pass

二、QFileDialog(文件類操作)

QFileDialog:是 PyQt/PySide 中用于文件選擇的標準對話框組件,它提供了打開/保存文件、選擇目錄等功能接口
選擇創建文件。

獲取文件路徑
file_path, selected_filter = QFileDialog.getOpenFileName(parent=None, caption='', directory='', filter='',options=QFileDialog.Options())

參數:
parent:QWidget 父窗口,通常傳入 self 或 None
caption:對話框標題
directory:初始顯示目錄(空字符串表示當前目錄)
filter:文件類型過濾器
options:額外選項配置
返回值:
file_path:用戶選擇的文件路徑(字符串),如果取消則為空字符串
selected_filter:用戶選擇的過濾器

from PyQt5.QtWidgets import QFileDialogfile_path, _ = QFileDialog.getOpenFileName(self, 'Open File', 'E:/Code', 'Text Files(*.txt *.csv);;All Files(*)')
if file_path:print("選擇的文件:", file_path)

獲取保存文件路徑
file_path, selected_filter = QFileDialog.getSaveFileName(parent=None, caption='', directory='', filter='', options=QFileDialog.Options())

參數:
parent:QWidget 父窗口,通常傳入 self 或 None
caption:對話框標題
directory:初始顯示目錄(空字符串表示當前目錄)
filter:文件類型過濾器
options:額外選項配置
返回值:
file_path:指定的保存路徑(字符串),如果取消則為空字符串
selected_filter:用戶選擇的過濾器

from PyQt5.QtWidgets import QFileDialogsave_path, filter_used = QFileDialog.getSaveFileName(None,"導出數據","data_export","CSV文件 (*.csv);;JSON文件 (*.json)")
if save_path:pass

獲取文件夾路徑
directory = QFileDialog.getExistingDirectory(parent=None, caption='', directory='', options=QFileDialog.Options())

參數:
parent:QWidget 父窗口,通常傳入 self 或 None
caption:對話框標題
directory:初始顯示目錄(空字符串表示當前目錄)
options:額外選項配置
返回值:
file_path:選擇的目錄路徑(字符串),如果取消則為空字符串
dir_path = QFileDialog.getExistingDirectory( None, “選擇目錄”, “”)

from PyQt5.QtWidgets import QFileDialogfile_path = QFileDialog.getExistingDirectory(self, 'Open File', 'E:/Code')
if file_path:self.edit.setText(file_path)

三、QMessageBox(對話框)

QMessageBox:是PyQt/PySide中用于顯示消息對話框的類,可以用來顯示信息、警告、錯誤或提問。以下是QMessageBox的詳細使用方法

QMessageBox常規用法:

from PyQt5.QtWidgets import QMessageBox# 顯示一個簡單的信息對話框
QMessageBox.information(None, "標題", "這是一條信息消息")    # None可以是QWidget	父窗口 即QWidget窗口時使用self# 顯示警告對話框
QMessageBox.warning(None, "警告", "這是一個警告消息")# 顯示錯誤對話框
QMessageBox.critical(None, "錯誤", "這是一個錯誤消息")# 顯示提問對話框(最后一個參數為默認選項)
reply = QMessageBox.question(None, "問題", "你確定要繼續嗎?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes:print("用戶選擇了是")
else:print("用戶選擇了否")

QMessageBox自定義用法:

圖標類型含義
QMessageBox.NoIcon無圖標
QMessageBox.Question問題圖標
QMessageBox.Information信息圖標
QMessageBox.Warning警告圖標
QMessageBox.Critical錯誤圖標
按鈕類型
QMessageBox.Ok
QMessageBox.Open
QMessageBox.Save
QMessageBox.Cancel
QMessageBox.Close
QMessageBox.Yes
QMessageBox.No
QMessageBox.Abort
QMessageBox.Retry
QMessageBox.Ignore
msg_box = QMessageBox()
msg_box.setIcon(QMessageBox.Information)  # 設置圖標類型
msg_box.setWindowTitle("自定義對話框")    # 設置標題
msg_box.setText("這是主要消息")           # 設置主要文本
msg_box.setInformativeText("這是附加信息") # 設置附加信息
msg_box.setDetailedText("這是詳細文本\n可以有多行") # 設置詳細文本# 添加自定義按鈕
msg_box.addButton("自定義按鈕1", QMessageBox.AcceptRole)
msg_box.addButton("自定義按鈕2", QMessageBox.RejectRole)# 顯示對話框
ret = msg_box.exec_()if ret == QMessageBox.AcceptRole:print("點擊了自定義按鈕1")
else:print("點擊了其他按鈕")

四、QTreeWidget(樹結構類操作)

QTreeWidget:是PyQt中用于顯示樹形結構數據的重要組件,它繼承自QTreeView,提供了更簡單易用的接口來處理樹狀數據。常用函數如下:

函數含義
root_tree.setColumnCount(2)設置列數(兩列)
root_tree.setHeaderLabels([“名稱”, “類型”])設置列標題
root_tree.setColumnWidth(0, 200)設置列寬(第一列寬度200)
root_tree.header().setSectionResizeMode(QtWidgets.QHeaderView.ResizeToContents)列寬自適應
root_tree.expandAll()全部展開
root_tree.collapseAll()全部收起
root_tree.invisibleRootItem().childCount()獲取根節點的子節點數
root_tree.invisibleRootItem().child(i)獲取根節點的某個子節點
item.childCount()獲取當前節點的子節點數
item.child(i)獲取當前節點的某個子節點
item.setText(0, “根節點”)設置內容
item.setIcon(0, QIcon(“”))設置圖片
item.setCheckState(0, QtCore.Qt.Unchecked)設置選中狀態
item.checkState(0)獲取選中狀態(參數表示哪列)
item.text(0)獲取某列內容(參數表示哪列)
item.parent().text(column)獲取父節點內容(參數表示哪列)

4.1 樹結構的初始化

# 創建QTreeWidget對象
self.tree_widget = QTreeWidget()# 設置列數、列標題、列寬
self.tree_widget.setColumnCount(2)
self.tree_widget.setHeaderLabels(["名稱", "類型"])
self.tree_widget.setColumnWidth(0, 200)
self.tree_widget.setColumnWidth(1, 150)
# self.tree_widget.header().setSectionResizeMode(QtWidgets.QHeaderView.ResizeToContents)  # 列寬自適應# 添加數據項(父節點)
root_item = QTreeWidgetItem(self.tree_widget)
root_item.setText(0, "根節點")
root_item.setText(1, "文件夾")
root_item.setCheckState(0, QtCore.Qt.Unchecked)  # 設置勾選狀態(不勾選)  可省略# 添加數據項(子節點)
child_item = QTreeWidgetItem(root_item)
child_item.setText(0, "子節點1")
child_item.setText(1, "文件")
child_item.setCheckState(0, QtCore.Qt.Unchecked)  # 設置勾選狀態(不勾選)  可省略self.tree_widget.expandAll()      # 所有節點展開
self.tree_widget.collapseAll()    # 所有節點收起

4.2 遞歸讀取完整樹結構

# 創建QTreeWidget實例
tree_widget = QTreeWidget()    # 初始化...略
# 獲取不可見的根項
root = tree_widget.invisibleRootItem()
for i in range(root.childCount()):item = root.child(i)read_tree_item(item)def read_tree_item(item):"""遞歸讀取樹形項及其子項"""select_status = item.checkState(0)  # 獲取勾選狀態 (參數表示列索引)# 遍歷讀取每列信息for col in range(item.columnCount()):print(item.text(col))# 遞歸處理子項for child_index in range(item.childCount()):child = item.child(child_index)read_tree_item(child)

4.3 兩QTreeWidget滑輪同步滑動

# 創建并初始化
self.tree1 = QtWidgets.QTreeWidget()
self.tree2 = QtWidgets.QTreeWidget()
for i in range(100):QtWidgets.QTreeWidgetItem(self.tree1).setText(0, str(i))QtWidgets.QTreeWidgetItem(self.tree2).setText(0, str(i))# 獲取水平滾動條
scoll1 = self.tree1.verticalScrollBar()
scoll2 = self.tree2.verticalScrollBar()
# 同步滾動
scoll1.valueChanged.connect(lambda val: scoll2.setValue(val))
scoll2.valueChanged.connect(lambda val: scoll1.setValue(val))

4.4 信號槽綁定

函數含義
itemSelectionChanged.connect()項選擇變化
itemClicked.connect()項被點擊
itemDoubleClicked.connect()項被雙擊
itemExpanded.connect()項展開
itemCollapsed.connect()項折疊
itemChanged.connect()項內容編輯
setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
customContextMenuRequested.connect(self.right_clicked_tree)
右擊事件
itemChanged.connect()勾選狀態變化事件

單擊事件

self.tree_widget.itemClicked.connect(self.clicked_item)def clicked_item(self, item, column):  # item: 點擊項   column:列if item:# 當前節點信息item_text = item.text(column)   # item.text(0)# 獲取父節點信息if item.parent():parent_text = item.parent().text(column)# 獲取子節點信息for child_index in range(item.childCount()):child_text = item.child(child_index).text(column)

雙擊事件

self.tree_widget.itemDoubleClicked.connect(self.double_clicked_item)def double_clicked_item(self, item, column):  # item: 點擊項   column:列if item:# 當前節點信息item_text = item.text(column)   # item.text(0)# 獲取父節點信息if item.parent():parent_text = item.parent().text(column)# 獲取子節點信息for child_index in range(item.childCount()):child_text = item.child(child_index).text(column)

勾選狀態事件

self.tree_widget.itemChanged.connect(self.item_changed)def item_changed(self, item, column):  # item: 點擊項   column:列if item.checkState(0) == Qt.Checked:print(f"項目 {item.text(0)} 被選中")else:print(f"項目 {item.text(0)} 取消選中")

右擊菜單欄

如實現右擊彈出菜單欄,將當前選選項移除

# 右擊綁定事件
self.tree_widget.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.tree_widget.customContextMenuRequested.connect(self.right_clicked_tree)def right_clicked_tree(self, pos):item = self.tree_widget.itemAt(pos)if item:menu = QMenu(self.tree_widget)remove_item = QAction("remove", self.tree_widget)remove_item.triggered.connect(lambda: self.remove_item(item))   # 移除事件綁定menu.addAction(remove_item)menu.exec_(QtGui.QCursor.pos())# 移除當前項
def remove_item(self, item):if item.parent():item.parent().removeChild(item)else:index = self.tree_widget.indexOfTopLevelItem(item)self.tree_widget.takeTopLevelItem(index)

一般來說,直接使用Menu,對選項右擊也會出發事件,這是需要對menu進行部分函數封裝改寫,忽略右擊對菜單欄選項操作

class MyMenu(QtWidgets.QMenu):# 忽略右擊選項def mousePressEvent(self, event):if event.button() == QtCore.Qt.LeftButton:super().mousePressEvent(event)else:event.ignore()

五、QCombox改寫下拉多勾選框

一般來說QCombox只支持下拉選擇一項選擇,這里繼承QCombox類,并對其封裝改寫,實現下拉多選框,即:可以選擇多個選項,代碼如下(這里添加了一個全選選項,需要放在開頭)

from PyQt5.QtWidgets import QComboBox
from PyQt5.QtCore import Qt, QEvent
from PyQt5.QtGui import QFontMetrics, QStandardItemclass MyComboBox(QComboBox):def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)self.setEditable(True)self.lineEdit().setReadOnly(True)self.model().dataChanged.connect(self.updateText)self.lineEdit().installEventFilter(self)self.view().viewport().installEventFilter(self)self.updateText()def eventFilter(self, object, event):if object == self.lineEdit():if event.type() == QEvent.MouseButtonRelease:self.shwPopup()return Falseif object == self.view().viewport():if event.type() == QEvent.MouseButtonRelease:index = self.view().indexAt(event.pos())item = self.model().item(index.row())if item.text() == "ALL" and item.checkState() == Qt.Checked:[self.model().item(i).setCheckState(Qt.Unchecked) for i in range(self.model().rowCount())]elif item.text() == "ALL":[self.model().item(i).setCheckState(Qt.Checked) for i in range(self.model().rowCount())]else:item.setCheckState(Qt.Unchecked if item.checkState() == Qt.Checked else Qt.Checked)self.model().item(0).setCheckState(Qt.Unchecked)for i in range(1, self.model().rowCount()):if self.model().item(i).checkState() != Qt.Checked:self.model().item(i).setCheckState(Qt.Unchecked)return Trueself.model().item(0).setCheckState(Qt.Checked)return Truereturn Falsedef updateText(self):text = ".".join([self.model().item(i).text() for i in range(self.model().rowCount())if self.model().item(i).checkState() == Qt.Checked])elidedText = QFontMetrics(self.lineEdit().font()).elidedText(text, Qt.ElideRight, self.lineEdit().width())self.lineEdit().setText(elidedText)def addItem(self, text, data=None):item = QStandardItem()item.setText(text)item.setFlags(Qt.ItemIsEnabled|Qt.ItemIsUserCheckable)item.setData(Qt.Unchecked, Qt.CheckStateRole)self.model().appendRow(item)self.lineEdit().setText("")def currentText(self):res = [self.model().item(i).text() for i in range(self.model().rowCount())if self.model().item(i).checkState() == Qt.Checked]return res

六、QRadioButton(單選按鈕控件)

QRadioButton是PyQt中常用的單選按鈕控件,用于讓用戶在多個互斥選項中選擇一個
(注:下方省略了將按鈕放入布局中)

創建單選按鈕并綁定信號

from PyQt5.QtWidgets import QRadioButton# 創建單選按鈕
radio1 = QRadioButton("選項1")
radio2 = QRadioButton("選項2")# 設置默認選中
radio1.setChecked(True)# 信號綁定
radio1.clicked.connect(self.on_radio_clicked)
radio2.clicked.connect(self.on_radio_clicked)
def on_radio_clicked(self):if radio1.isChecked():print("選項1被選中")elif radio2.isChecked():print("選項2被選中")

創建兩組單選按鈕組

from PyQt5.QtWidgets import QButtonGroup# 創建按鈕組一:二選一
button_group1 = QButtonGroup()
radio1 = QRadioButton("選項1")
button_group.addButton(radio1)
radio2 = QRadioButton("選項2")
button_group.addButton(radio2)
radio1.setChecked(True)  # 默認選中# 創建按鈕組二:二選一
button_group2 = QButtonGroup()
radio3 = QRadioButton("選項3")
button_group2.addButton(radio3, 3)
radio4 = QRadioButton("選項4")
button_group2.addButton(radio4, 4)
radio3.setChecked(True)  # 默認選中# 按鈕組事件綁定
button_group1.buttonClicked.connect(self.on_radio_group_clicked)
def on_radio_group_clicked(self, button):print(f"選中了: {button.text()}")# id識別按鈕  綁定按鈕組的idClicked信號
button_group.idClicked.connect(self.on_radio_group_id_clicked)
def on_radio_group_id_clicked(self, id):print(f"選中了ID為 {id} 的按鈕")# 單個按鈕事件綁定同上,略

七、QTextEdit(多行文本框)

QTextEdit是PyQt中用于多行文本編輯的控件,支持富文本格式(HTML)、純文本和高級文本編輯功能

函數含義
toPlainText()獲取純文本
append()在末尾添加文本
clear()清空文本
setHtml()設置HTML富文本
currentCharFormat()獲取當前文本格式
setReadOnly(True)設置為只讀
setLineWrapMode(QTextEdit.NoWrap)不自動換行
setTabStopDistance(40)設置Tab鍵寬度(像素)
find()查找文本
textChanged.connect文本改變時觸發
cursorPositionChanged.connect光標位置改變時觸發
selectionChanged.connect選中文本改變時觸發
self.line_edit = QtWidgets.QTextEdit()
self.layout.addWidget(self.line_edit)# 追加內容
self.line_edit.append("hello")
# 獲取存文本
txt = self.line_edit.toPlainText()# 設置文字樣式并追加到末尾
txt_format = QtGui.QTextCharFormat()
txt_format.setFontWeight(QtGui.QFont.Bold)     # 加粗
txt_format.setFontItalic(True)                 # 斜體
txt_format.setFontUnderline(True)              # 下劃線
txt_format.setForeground(QtGui.QColor('red'))  # 文字顏色
cursor = self.line_edit.textCursor()
cursor.movePosition(QtGui.QTextCursor.End)
cursor.setCharFormat(txt_format)
cursor.insertText("hello")
self.line_edit.setTextCursor(cursor)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/909030.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/909030.shtml
英文地址,請注明出處:http://en.pswp.cn/news/909030.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

校園導航系統核心技術解析:高精度定位與 AR 實景導航的應用實踐

本文面向校園信息化建設者、技術開發者及教育行業數字化轉型關注者,旨在解析如何通過 “高精度定位 AR/VR 場景化服務” 技術體系,破解校區因建筑復雜、人流密集導致的尋路效率低下問題,探討如何利用現有技術解決校園內導航難題,…

java大文件分段下載

后端代碼 package com.jy.jy.controller;import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.a…

antd-vue - - - - - a-table排序

antd-vue - - - - - a-table排序 1. 重點代碼:2. 代碼示例:3. 進階版寫法 1. 重點代碼: sorter: {compare: (a, b) > a.columnsKeys - b.columnsKeys,multiple: 1, },解析: compare: 自定義排序函數,用于比較兩個對象。 multiple: 排序優…

【AI】模型vs算法(以自動駕駛為例)

模型vs算法(以自動駕駛為例) 一、自動駕駛的核心任務二、以自動駕駛為例,模型vs算法的實際分工1. 感知環節:“看懂”周圍環境(如識別行人、車道線、車輛)2. 預測環節:“預判”其他交通參與者的行…

機器學習與深度學習19-線性代數02

目錄 前文回顧6.協方差矩陣與主成分分析7.矩陣的奇異值分解8.神經網絡的前向傳播和反向傳播9.矩陣的跡10.特征工程的多項式特征擴展 前文回顧 上一篇文章鏈接:地址 6.協方差矩陣與主成分分析 協方差矩陣是一個對稱矩陣,用于衡量隨機變量之間的線性相關…

青藏高原ASTER_GDEM數據集(2011)

共享方式:開放獲取數據大小:73.69 GB數據時間范圍:2012-04-08 — 2012-05-08元數據更新時間:2021-10-15 數據集摘要 ASTER Global Digital Elevation Model (ASTER GDEM)是美國航空航天局 (NAS…

代碼隨想錄訓練營二十六天| 654.最大二叉樹 617.合并二叉樹 700.二叉搜索樹的搜索 98.驗證二叉搜索樹

654.最大二叉樹: 文檔講解:代碼隨想錄|654.最大二叉樹 視頻講解:又是構造二叉樹,又有很多坑!| LeetCode:654.最大二叉樹_嗶哩嗶哩_bilibili 狀態:已做出 思路: 這道題目要求使用給定…

臨時抱佛腳v2

術語解釋 多范式 (Multi-paradigm) 指支持多種編程范式,如面向對象編程和函數式編程,允許開發者根據需求選擇最合適的風格。 函數式編程 (Functional Programming) 一種編程范式,將計算視為數學函數的求值,強調不變性、無副作用…

MCGS和1200plc變量表格式編輯

設備編輯窗口---設備信息導出---另存為xx.CSV文件 在上面導出的表格基礎上編輯 本體位的編輯: db數據塊位編輯 db數據塊int類型 (4.14應改為4.140,0不省略) db數據塊real類型 通道號,地址均按順序排列 ,寄存期地址最后一位0不能省略&#…

Android高性能音頻與圖形開發:OpenSL ES與OpenGL ES最佳實踐

引言 在移動應用開發中,音頻和圖形處理是提升用戶體驗的關鍵要素。本文將深入探討Android平臺上兩大核心多媒體API:OpenSL ES(音頻)和OpenGL ES(圖形),提供經過生產環境驗證的優化實現方案。 …

GaussDB分布式數據庫調優方法總結:從架構到實踐的全鏈路優化指南

GaussDB分布式數據庫調優方法總結:從架構到實踐的全鏈路優化指南 GaussDB作為華為自主研發的分布式數據庫,基于MPP(大規模并行處理)架構設計,支持存儲與計算分離、列存/行存混合引擎、向量化執行等核心技術&#xff0…

NLP學習路線圖(三十九):對話系統

在人工智能領域,自然語言處理(NLP)無疑是推動人機交互革命的核心引擎。當清晨的鬧鐘響起,你輕聲一句“小愛同學,關掉鬧鐘”;當開車迷路時說“嘿Siri,導航到最近加油站”;當深夜向客服機器人詢問訂單狀態時——我們已在不知不覺中與對話系統建立了千絲萬縷的聯系。這類系…

Cambridge Pixel為警用反無人機系統(C-UAS)提供軟件支持

警用 C-UAS 系統受益于 Cambridge Pixel 和 OpenWorks Engineering 的技術合作。 作為雷達數據處理和雷達目標跟蹤的專家公司,Cambridge Pixel宣布與OpenWorks Engineering 合作,為警用系統提供先進的C-UAS系統。OpenWorks Engineering以創新的光學系統和…

【ArcGIS Pro微課1000例】0072:如何自動保存編輯內容及保存工程?

文章目錄 一、自動保存編輯內容二、自動保存工程在使用ArcGIS或者ArcGIS Pro時,經常會遇到以下報錯,無論點擊【發送報告】,還是【不發送】,軟件都會強制退出,這時如果對所操作沒有保存,就會前功盡棄。 此時,自動保存工作就顯得尤為重要,接下來講解兩種常見的自動保存方…

進行性核上性麻痹健康護理指南:全方位照護之道

進行性核上性麻痹(PSP)是一種罕見的神經系統變性疾病,會嚴重影響患者的生活質量。做好健康護理,能在一定程度上緩解癥狀,提高患者生活質量。 ?飲食護理是基礎。患者常伴有吞咽困難,飲食應選擇質地均勻、易…

第二節:Vben Admin v5 (vben5) Python-Flask 后端開發詳解(附源碼)

目錄 前言項目準備項目結構應用創建應用工廠`vben5-admin-backend/app/__init__.py` 文件`vben5-admin-backend/app/config.py` 文件`vben5-admin-backend/app/.env` 文件`vben5-admin-backend/app/logging_config.py` 文件`vben5-admin-backend/app/start.py` 文件`vben5-admi…

從零打造前沿Web聊天組件:從設計到交互

作者現在制作一款網頁端聊天室(青春版),之前一直有這個想法,現在總算是邁出了第一步開始制作了… 雄關漫道真如鐵,而今邁步從頭越! 啟程 當前已經完成左側聊天室列表顯示,通過http://localhos…

計算機網絡 : 傳輸層協議UDP與TCP

計算機網絡 : 傳輸層協議UDP與TCP 目錄 計算機網絡 : 傳輸層協議UDP與TCP引言1. 傳輸層協議UDP1.2 UDP協議段格式1.3 UDP的特點1.4 面向數據報1.5 UDP的緩沖區1.6 基于UDP的應用層協議及使用注意事項 2. 傳輸層協議TCP2.1 再談端口號2.2 TCP協議段格式2.…

Java高頻面試之并發編程-27

hello啊,各位觀眾姥爺們!!!本baby今天又來報道了!哈哈哈哈哈嗝🐶 面試:詳細說說AtomicInteger 的原理 AtomicInteger 的原理詳解 AtomicInteger 是 Java 并發包 (java.util.concurrent.atomic)…

冒險島的魔法果實-多重背包

問題描述 在冒險島的深處,小萌探索到了一個傳說中的魔法果實園。這里滿是各種神奇的魔法果實,吃了可以增加不同的魔法能量。 小萌想帶一些魔法果實回去,但是他的背包空間有限。看著這些琳瑯滿目的魔法果實,小萌很是糾結&#xf…