日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python3 GUI用户界面总结(以串口调试为例,持续改进)

發布時間:2024/3/26 python 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python3 GUI用户界面总结(以串口调试为例,持续改进) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文主要目的是總結串口調試助手開發過程中遇到的問題和解決方法,以及總結通用資料以備后續參考,歡迎批評指正。

需要掌握的基礎內容:

  • 涉及到的python庫的基本操作
  • 串口通信基礎
  • 進制轉換等算法問題
  • python3基礎語言和方法

本文安排:

  • python庫簡介,包括tkiner、serial
  • 開發上位機過程中遇到的函數調用方式、庫方法使用方式
  • 涉及具體算法需要掌握的知識基礎
  • 其他可能用到的資料

內容比較瑣碎,可根據目錄查看所需內容。詳情查看所附鏈接。

文章目錄

        • 開發上位機用到的python庫
          • serial簡介
          • PyQt5簡介
          • tkinter簡介
          • tkinter包含的控件
            • mainloop的實質
            • tkinter text
            • Scrollbar控件-添加滑動條
            • numpy
          • threading庫簡介
            • join
        • 開發串口調試助手
          • 串口類
          • 打包GUI程序為exe文件
        • 錯誤解決
          • 讀取串口數據時崩潰、無數據、數據不全
          • 丟包
          • 串口通信之數據丟失
        • python相關
          • 為什么要加if __name __==‘__main __’:
          • 線程
            • 并發與并行
            • 線程與進程
            • 單線程與多線程
          • 常見異常類型
          • 重命名變量方法
          • 運算
            • 原碼補碼轉換
            • python指數**
          • 數值與字符串
            • python讀取字符串長度len()
            • python的數值與字符串區分
            • python二進制-十進制轉換
            • python字符串轉十進制整型
            • python截取字符串
            • python 替換字符串
            • 列表插入元素append
            • python 二維列表
            • python二維列表對應元素相加
            • encode與decode
          • 文件
            • 讀寫文件(txt、csv、excel)
            • 文件操作模式
          • python跨文件調用函數
          • datetime庫 獲取當前時間
        • 實例鏈接
          • 計算器GUI實例
          • 串口調試助手GUI實例
          • 讀取串口數據并寫入txt文件

開發上位機用到的python庫

此處僅為庫的簡介,以及實際開發上位機過程中遇到的重要的控件。

serial簡介

serial 是串口接口庫,與串口通信相關的操作都需使用。

程序中import serial 實際安裝的是pyserial庫,關于pyserial的詳細手冊鏈接和資料,可參見: python庫之pyserial用法_CSDN博客

import serial后,工程文件夾下會有serial文件夾。
serial文件夾中的serialwin32.py可以找到庫函數的定義,如果看了上面鏈接中的函數說明仍然有疑惑,可以自行查看函數定義。

這個文件里有from serial import win32
涉及到win32的,可以到Microsoft文檔中找資料,如下圖為COMSTST結構體的說明。

PyQt5簡介

Python上位機軟件圖形界面實戰(2)_Funny-CSDN博客_python適合開發上位機嗎
PyQt5是用于圖形化界面設計的,僅設計界面,功能函數還需自己編寫。對界面要求不高的上位機只需用tkinter庫即可完成界面和功能的設計。

上位機圖形界面開發設計用QT Designer就可以了。但是qt designer生成的是.ui文件,我們需要將.ui轉換為我們用的py文件。

以下僅以tkinter和serial作為開發調試串口助手GUI的核心庫,此外可能會用到time庫進行延時操作。

tkinter簡介

Graphical User Interfaces with Tk — Python 3.8.5 documentation
Python GUI 編程(Tkinter) | 菜鳥教程

tkinter庫是Tcl / Tk的Python接口,用于制作和處理圖形用戶界面(Graphical User Interface,簡稱 GUI,又稱圖形用戶接口)

Tk / Tcl提供了與平臺無關的窗口工具箱,使用tkinter軟件包及其擴展名tkinter.tix和tkinter.ttk模塊的Python程序員可以使用該工具箱。

tkinter包是Tcl / Tk之上的面向對象層。要使用tkinter,您無需編寫Tcl代碼,但您需要查閱Tk文檔,有時還需要查閱Tcl文檔。 tkinter是一組將Tk小部件實現為Python類的包裝器。另外,內部模塊_tkinter提供了線程安全機制,該機制允許Python和Tcl進行交互。

tkinter的主要優點是速度快,并且通常與Python捆綁在一起。盡管其標準文檔weak,但仍然可以找到不錯的材料,其中包括:參考資料,教程,書籍等。但是,您可能會對許多其他GUI庫感興趣,有關替代方法的更多信息,請參見“其他圖形用戶界面包”。

注意,不同版本的python調用庫的名稱不同。

#!/usr/bin/python3import tkinter # 創建Tk top = tkinter.Tk() # 進入消息循環 top.mainloop() #!/usr/bin/python2 # -*- coding: UTF-8 -*-import Tkinter # 創建Tk top = Tkinter.Tk() # 進入消息循環 top.mainloop()
tkinter包含的控件

Python GUI之tkinter窗口視窗教程大集合 - 洪衛 - 博客園
控件介紹和基本操作見鏈接。

Tkinter支持16個核心的窗口部件,這個16個核心窗口部件類簡要描述如下:

控件功能
Button一個簡單的按鈕,用來執行一個命令或別的操作。
Canvas組織圖形。這個部件可以用來繪制圖表和圖,創建圖形編輯器,實現定制窗口部件。
Checkbutton代表一個變量,它有兩個不同的值。點擊這個按鈕將會在這兩個值間切換。
Entry文本輸入域。
Frame一個容器窗口部件。幀可以有邊框和背景,當創建一個應用程序或dialog(對話)版面時,幀被用來組織其它的窗口部件。
Label顯示一個文本或圖象。
Listbox顯示供選方案的一個列表。listbox能夠被配置來得到radiobutton或checklist的行為。
Menu菜單條。用來實現下拉和彈出式菜單。
Menubutton菜單按鈕。用來實現下拉式菜單。
Message顯示一文本。類似label窗口部件,但是能夠自動地調整文本到給定的寬度或比率。
Radiobutton代表一個變量,它可以有多個值中的一個。點擊它將為這個變量設置值,并且清除與這同一變量相關的其它radiobutton。
Scale允許你通過滑塊來設置一數字值。
Scrollbar為配合使用canvas, entry, listbox, and text窗口部件的標準滾動條。
Text格式化文本顯示。允許你用不同的樣式和屬性來顯示和編輯文本。同時支持內嵌圖象和窗口。
Toplevel一個容器窗口部件,作為一個單獨的、最上面的窗口顯示。
messageBox消息框,用于顯示你應用程序的消息框。(Python2中為tkMessagebox)

注意在Tkinter中窗口部件類沒有分級;所有的窗口部件類在樹中都是兄弟關系。

所有這些窗口部件提供了Misc和幾何管理方法、配置管理方法和部件自己定義的另外的方法。此外,Toplevel類也提供窗口管理接口。這意味一個典型的窗口部件類提供了大約150種方法。

mainloop的實質

mainloop()是tkinker的界面初始化完成后,開啟界面及其調度管理功能的函數。用戶只需按照庫中已有的方法編寫好所需的功能和界面,再執行mainloop,就可以實現上位機的程序開發過程。

以下偽代碼說明了其實質:鏈接

def mainloop():while the main window has not been closed:if an event has occurred:run the associated event handler function

只要GUI還在屏幕上,mainloop調用就不會返回執行代碼。

tkinter text

text:Python - Tkinter Text - Tutorialspoint

上面的鏈接中介紹了tkinter庫中的關于文本text的屬性、方法等。需要GUI顯示多行文字時使用,常見的應用是顯示輸出數據、顯示輸入文字等。下面是關于方法的截圖,insert用于在文本中添加內容,see用于選擇GUI上顯示的位置。

text在GUI上長這樣:

Scrollbar控件-添加滑動條

Tkinter 組件詳解(九):Scrollbar_一只沒有腳的豬的博客-CSDN博客
Scrollbar 組件通常與 Text 組件、Canvas 組件和 Listbox 組件一起使用,水平滾動條還能跟 Entry 組件配合。

text控件默認沒有滑動條,所以當文本內容超出窗口大小時不能判斷內容的多少和位置,很不方便。下面是scrollbar和text一起使用的例子。

如果只有一個滑動條,還可以綁定鼠標滾輪和滑動條(綁定后鼠標即使不點擊選中窗口,滑動滾輪也可以翻頁)

# 給text添加滑動條:# 設置滑動條,設置其位置st = tkinter.Scrollbar(self.mainwin) # 在text旁邊加# st.pack(side=tkinter.RIGHT, fill=tkinter.Y) # 在整個窗口旁邊加滑動條# textself.SendDataView = ScrolledText(self.mainwin, width=60, height=3,font=("宋體", 10)) # text實際上是一個文本編輯器self.SendDataView.place(x=230, y=35) # 顯示# 在text右邊添加滑動條self.SendDataView.focus_set() # 不知何用?st.config(command=self.SendDataView.yview)# 綁定鼠標滾輪和滑動條# self.mainwin.bind("<MouseWheel>", self._on_mousewheel)

鏈接

numpy

Python、Numpy 教程 | NumPy 中文

threading庫簡介

手冊(全英文):threading — Thread-based parallelism — Python 3.8.5 documentation

threading:Python 3 之后的線程模塊,提供了功能豐富的多線程支持,推薦使用。

Python 主要通過兩種方式來創建線程:(鏈接)

  • 使用 threading 模塊中 Thread 類的構造器創建線程。即直接對類 threading.Thread 進行實例化創建線程,并調用實例化對象的 start() 方法啟動線程。
  • 繼承 threading 模塊中的 Thread 類創建線程類。即用 threading.Thread 派生出一個新的子類,將新建類實例化創建線程,并調用其 start() 方法啟動線程。

線程需要手動啟動才能運行,threading 模塊提供了 start() 方法用來啟動線程。

import threadingdef t_receive():# 接收...def t_save():# 保存...# 創建線程 t1 = threading.Thread(target=t_receive) t2 = threading.Thread(target=t_save)# 設置t2為守護線程,即服務程序 t2.setDaemon(True)# 開啟線程 t1.start() t2.start()# 線程占用CPU直至死亡 t1.join() t2.join()

代碼鏈接

join

join() 方法的功能是在程序指定位置,優先讓該方法的調用者使用 CPU 資源。該方法的語法格式如下:

thread1.join( [timeout] )

其中,thread1 為 thread 類或其子類的實例化對象;timeout 參數作為可選參數,其功能是指定 thread 線程最多可以霸占 CPU 資源的時間(以秒為單位),如果省略,則默認直到 thread 執行結束(進入死亡狀態)才釋放 CPU 資源。

開發串口調試助手

背景知識(新手入門):
關于串口上位機編程你需掌握的背景知識_Robert Zhang-CSDN博客
哈嘍,上位機(上位機開發指南)_Robert Zhang_robert_cysy-CSDN博客

基本過程:

  • 完成所需功能(選擇串口、選擇波特率、發送、接收、顯示、輸出結果到文件)
  • 設計界面(文本、按鈕、選項框、大小、位置、顏色)
  • 連接功能函數和界面
  • 測試,解決bug
  • 封裝,打包為exe文件等等

代碼重點參考:
python實現串口通訊小程序(GUI界面)_明志的博客-CSDN博客_pycharm 開發串口

上位機開發工具對比:
原來這才是大家常用的上位機開發平臺_Robert Zhang-CSDN博客

下面只總結一些具體的方法和代碼。

串口類

定義串口處理類,后續操作可直接調用。

import serial import serial.tools.list_ports# 串口處理類 class SerialAchieve:def __init__(self, band=3000000, check="無校驗位", data=8, stop=1):self.port = None# 獲取可用串口self.port_list = list(serial.tools.list_ports.comports())assert (len(self.port_list) != 0), "無可用串口"self.bandRate = bandself.checkbit = checkself.databit = dataself.stopbit = stop# 讀寫的數據self.read_data = Noneself.write_data = Nonepassdef show_port(self):for i in range(0, len(self.port_list)):print(self.port_list[i])def show_other(self):print("波特率:" + self.bandRate)print("校驗位:" + self.checkbit)print("數據位:" + self.databit)print("停止位:" + self.stopbit)# 返回串口def get_port(self):return self.port_list# 打開串口def open_port(self, port):self.port = serial.Serial(port, self.bandRate, timeout=1) # timeout=None# 關閉串口def delete_port(self):if self.port != None:self.port.close()print("關閉串口完成")else:passdef Read_data(self): # self.port.read(self.port.in_waiting) 表示全部接收串口中的數據self.read_data = self.port.read(self.port.in_waiting) # 讀取數據return self.read_data.decode("utf-8")def Write_data(self, data):if self.port.isOpen() == False:print("串口打開錯誤")else:self.port.write(data.encode("utf-8")) # 返回的是寫入的字節數# 主類 class MainSerial:def __init__(self):# 定義串口變量self.port = Noneself.band = Noneself.check = Noneself.data = Noneself.stop = Noneself.myserial = None# 創建串口對象self.myserial = SerialAchieve(int(self.band), self.check, self.data, self.stop)# 處理串口值self.port_list = self.myserial.get_port()port_str_list = [] # 用來存儲切割好的串口號for i in range(len(self.port_list)):# 將串口號切割出來lines = str(self.port_list[i])str_list = lines.split(" ")port_str_list.append(str_list[0])# 主函數 if __name__ == '__main__':my_ser1 = MainSerial()my_ser1.show()
打包GUI程序為exe文件

如果要脫離python環境使用,則需要將寫好gui的python3的py文件打包成exe程序。

鏈接:

  • python3項目打包成exe可執行程序 - 測試一枝花 - 博客園
  • 怎么把python代碼打包成exe文件-百度經驗
  • 步驟(詳細步驟見鏈接):

  • 在命令窗口安裝pyinstaller庫
  • 在命令窗口切換到打包程序目錄
    例:需要打包程序目錄為:D:\automation\autotest_tool\interface_param_change_tool
    切換指令:cd D:\automation\autotest_tool\interface_param_change_tool
  • 打包文件,pyinstaller -F xxx.py(xxx.py,打包的文件)
    例:需要打包的python程序為:runner.py
    指令:pyinstaller -F runner.py
  • 檢查是否成功,到打包文件目錄查看打包好的程序,并執行
    打包成功后項目中新增dist文件,進入dist文件,點擊運行打包好的exe程序
  • 錯誤解決

    讀取串口數據時崩潰、無數據、數據不全

    python-在Python3.7的環境下,每次都是執行到serial.read()就卡住了。——CSDN問答頻道

    上位機崩潰(不斷輸出,鼠標點擊后無響應)。
    可能是由于陷入死循環中,阻塞了,不能進行其他操作。可檢查讀取串口的函數,看看是不是無限循環,無法退出。還可能是要讀取的數據太多了,超出緩存區大小。
    解決:增加退出條件,或建立線程(需要操作系統相關知識)。
    關于超出緩存的問題,可參考下面鏈接關于緩存區大小和解決思路的討論:
    串口一次最大能接收多少字節-CSDN論壇

    上位機要接收兩次才能將下位機發送數據顯示完全。

    • 緩沖區決定一次接收數據大小。
    • 一般串口硬件只有1個字節緩沖,其他都是系統自己的內存做暫存緩沖的,而且一般不會很大。最好自己設置一個內存,多少取決于你的內存大小,中斷消息處理串口數據,存到自己的緩沖區,等到字節到了你需要的,再從緩沖區讀出。這樣就非常靈活了。鏈接

    接收數據,但無數據顯示。
    首先排除單片機確實無數據發送的情況,再考慮是否由于沒有增加延時,導致緩存區里沒有儲存到單片機發送的數據。
    解決:在讀取串口數據之前增加延時語句。延時可import time,使用time庫中的time.sleep(sec),參數單位為秒。

    補充:

    • serial.iswaiting啟動接收,并返回接收數據的長度,然后用read(n)將這指定的數據讀出來。但現實中的問題是兩者的中間需要加延時(根據波特率計算發送內容所需的時間,這樣就不會出現延時過短讀出的不全;延時時間長了就會出現前后幀發出的內容重合到一起),此外如果需要判斷什么時候串口不活動,可以再serial.iswaiting一直延時(超過幾個字符的傳送時間,軟件延時計數器累加),而在循環體外將計數器清零,在累計的幾個字符時間接受的數據長度還為0則認為通訊結束。鏈接

    數據不全,有數據顯示,但缺少了內容。
    可能是單片機發送的時間長,延時時間比數據發送時間短,所以緩存中內容只有顯示的那些數據。還可能是由于接受串口數據晚了,單片機發的數據沒及時存到緩存里。還可能是由于接收及顯示期間有中斷打斷該過程,執行完畢后經過一段時間,等到返回原程序處時已不能實現實時接收和顯示的功能。
    解決:延時時間加長(延時期間不能進行操作,為阻塞狀態,不推薦),或考慮中斷返回后進行判斷,進一步處理,或建立多線程。

    丟包

    網絡丟包:
    什么是丟包,為什么會丟包 - 知乎

    數據丟包:
    下位機、PC都有能力高速發送或接受數據,但過高的傳輸速率(高波特率)意味著,中間的傳輸線路一旦受到干擾更容易發生電平不能及時轉換的問題。從幫助理解的角度,可以將數據看作一位一位的0/1組成的值,傳輸本身是高低電平的轉換,高電平代表1,低電平代表0。
    數據丟包的原因:噪聲干擾、強磁場環境
    間接原因:波特率過高,更易出錯
    解決:盡量在滿足應用速度要求的前提下,低速率傳輸;采用可靠的協議;保持硬件穩定。

    數據顯示不全與數據丟包要區分開,丟包是在傳輸途中出現問題,顯示不全可能是由于丟包,也可能是由于上位機程序邏輯編寫錯誤,或者單線程且處理數據緊接在接收數據之后,導致處理數據時接收值未顯示,而下次顯示時緩存中已被新數據覆蓋等等。

    串口通信之數據丟失

    串口通信丟失數據結局方案——C#_紫冰寒寞的專欄-CSDN博客_serialport 字符缺失

    串口通信的一般思路是:先接收數據,然后處理數據,并在數據處理之后再次等待接收新的數據。但這種方法的缺點是,在串口高速率大信息量通信時,會出現丟失數據的情況。

    丟失數據的原因是數據接收和數據處理再同一個線程中,如果數據處理的時間太長,則來不及接收的數據只能暫存在緩存中。因此,一旦緩存滿了,新到的數據就會沖刷掉未來得及接收的數據,從而造成數據的丟失。因此,只是增加緩存的容量不能解決數據丟失的根本問題。

    解決思路:

    • 數據接收與數據處理分別放在兩個線程中進行;
    • 數據接收線程:接收數據并將接收到的數據存入數據池中;
    • 數據處理線程:從數據池中讀取數據和處理數據;

    注意:

    • 由于兩個線程可能會同時訪問數據池,因此為了使數據接收得到最快的響應,最好不選用數組結構,而是選用隊列Queue作為數據池的數據結構。

    隊列在順序存儲方面非常有用。數據對象在隊列的一段插入,另一端移除。當兩個線程同時訪問隊列時,一個線程負責數據存入,另一個線程只負責操作數讀取,就會提高程序的運行效率。

    為何丟失數據量的大小不確定?
    舉個例子,如果是由于單線程進行讀取數據和處理數據,那么處理數據期間就不能讀取,緩存區若溢出,則會被覆蓋。如果處理數據的操作和量是固定的,按道理會丟失定量的數據,但實際上緩沖區中的數據量不一定,處理的數據量也不一定,讀取的速度也有不確定性,所以丟失的數據量也不會是恒定的。

    如果讀取足夠快,或者次數足夠少,能夠不影響數據繼續寫入緩存區,那么就能讀取完整的數據,數據量等于發送量。

    python相關

    為什么要加if __name __==‘__main __’:

    不寫也可以啟動,但最好加上,因為if __ name __ == ’ __ main __’的意思是:當.py文件被直接運行時,if __ name __ == ’ __ main __’之下的代碼塊將被運行;當.py文件以模塊形式被導入時,if __ name __ == ’ __ main __’之下的代碼塊不被運行。

    一些功能由于比較復雜,往往需要多人開發,一個python程序對應一個功能,為便于測試,每個功能程序下都有一個主函數。在主程序中,只需import功能程序所在文件,就可以調用功能py程序的函數(關于如何跨文件調用函數見本文目錄)。為了保證功能文件中的主函數不被導入到主函數中,就需要注釋掉每個功能程序中的主函數,這十分的麻煩。因此python提供了if __name __==‘__main __’:條件,只要編寫主函數時均在此條件下編寫,就可以保證運行哪個程序就用哪個主函數。

    來自鏈接:https://blog.csdn.net/qq_25939803/article/details/98038106

    線程

    python多線程詳解 - luyuze95 - 博客園
    鏈接目錄:

    python多線程詳解一、線程介紹 什么是線程 為什么要使用多線程 二、線程實現 threading模塊 自定義線程 守護線程 主線程等待子線程結束 多線程共享全局變量 互斥鎖 遞歸鎖 信號量(BoundedSemaphore類) 事件(Event類) 三、GIL(Global Interpreter Lock)全局解釋器鎖
    并發與并行

    幾乎所有的操作系統都支持同時運行多個任務,每個任務通常是一個程序,每一個運行中的程序就是一個進程,即進程是應用程序的執行實例。現代的操作系統幾乎都支持多進程并發執行。

    • 并行指在同一時刻有多條指令在多個處理器(多核處理器)上同時執行
    • 并發是指在同一時刻只能有一條指令執行,但多個進程指令被快速輪換執行,使得在宏觀上具有多個進程同時執行的效果。
    線程與進程

    首先需要強調的是,線程和進程對于開發一般的上位機串口助手不是必須的,尤其是對于操作系統不夠了解的新手來說,使用線程需要補充很多基礎知識,較為耗時。

    對于一個 CPU 而言,在某個時間點它只能執行一個程序。也就是說,只能運行一個進程,CPU 不斷地在這些進程之間輪換執行。那么,為什么用戶感覺不到任何中斷呢?

    這是因為相對人的感覺來說,CPU 的執行速度太快了(如果啟動的程序足夠多,則用戶依然可以感覺到程序的運行速度下降了)。所以,雖然 CPU 在多個進程之間輪換執行,但用戶感覺到好像有多個進程在同時執行。

    單線程與多線程

    Python進程和線程(包含兩者區別)

    • 當一個進程里只有一個線程時,叫作單線程。
    • 一個進程里超過一個線程就叫作多線程。

    線程是進程的組成部分,一個進程可以擁有多個線程。在多線程中,會有一個主線程來完成整個進程從開始到結束的全部操作,而其他的線程會在主線程的運行過程中被創建或退出。

    當進程被初始化后,主線程就被創建了,對于絕大多數的應用程序來說,通常僅要求有一個主線程,但也可以在進程內創建多個順序執行流,這些順序執行流就是線程。

    每個線程必須有自己的父進程,且它可以擁有自己的堆棧、程序計數器和局部變量,但不擁有系統資源,因為它和父進程的其他線程共享該進程所擁有的全部資源。線程可以完成一定的任務,可以與其他線程共享父進程中的共享變量及部分環境,相互之間協同完成進程所要完成的任務。

    線程的運行是搶占式的,也就是說,當前運行的線程在任何時候都可能被掛起,以便另外一個線程可以運行。

    多線程也是并發執行的,即同一時刻,Python 主程序只允許有一個線程執行,這和全局解釋器鎖有關系,后續會做詳細介紹。

    一個線程可以創建和撤銷另一個線程,同一個進程中的多個線程之間可以并發運行。

    從邏輯的角度來看,多線程存在于一個應用程序中,讓一個應用程序可以有多個執行部分同時執行,但操作系統無須將多個線程看作多個獨立的應用,對多線程實現調度和管理以及資源分配,線程的調度和管理由進程本身負責完成。

    常見異常類型

    Python 常見異常類型 - Bactiy - 博客園
    python 異常類型_Lapland的博客-CSDN博客

    異常處理:
    python中的異常及幾種常見異常_棠牧師的博客-CSDN博客

    try: 功能,應該做什么
    except: 若有異常,做什么

    重命名變量方法

    右鍵變量名稱-> Refactor-> Rename
    直接重命名所有同名變量。

    運算
    原碼補碼轉換

    代碼:
    python——原碼轉補碼_cherry1307的博客-CSDN博客_python原碼轉補碼

    • 源碼轉補碼或補碼轉源碼都可用同一步驟實現
    • 何時轉換:有符號型二進制數且符號位為1時才需要轉換
    • 轉換步驟:除最高位1外,其余位取反得到反碼,反碼加1得補碼或原碼。
    • 代碼:見上面的鏈接,親測可用,感謝博主
    python指數**

    例:求次方、根號、倒數

    # 2的立方 print(2**3) # 8# 9開二次方根 print(9**(1/2)) # 3.0# 2平方的倒數 print(2**(-2)) # 0.25
    數值與字符串
    python讀取字符串長度len()

    len()的參數只能是字符串類型。

    例:

    print(len('0b10001')) # 7
    python的數值與字符串區分

    ‘10001’:字符串
    10001:十進制
    ‘0b10001’:字符串
    0b10001:二進制

    print(bin(17))顯示0b10001,沒問題。
    不過,print(0b10001)顯示的是十進制17,而不是0b10001,有人知道這是為什么嗎?

    若有誤,歡迎指正留言。

    python二進制-十進制轉換

    python十進制轉換為二進制,八進制_qq_37178232的博客-CSDN博客_十進制6轉二進制的計算過程python

    十進制轉二進制:
    bin()函數,例子:17的二進制數是10001,bin(17)為0b10001
    bin函數得到二進制字符串

    def mybin(a):#自定義函數去除系統自帶的多余0bb=bin(a) # a為int型整數17,bin(a)為0b10001b=b.replace('0b','') # 用空字符替代0bprint(b)mybin(17) # 結果 10001

    注意:bin轉換的二進制默認最高位為1,高位的0會被去除,即0b類型。
    注意:replace() 不會改變原 string 的內容,要想改變需要重新賦值給原string。

    二進制轉十進制:
    注意:bin()轉換的結果是字符串,不能直接用int()轉換為十進制整型,只有去除0b才可以,因為字母不能轉換為int。

    print(int(0b10001)) # 輸出17# b=bin(7) # print(int(b)) # ValueError: invalid literal for int() with base 10: '0b10001'

    注意:默認在int()中轉換的是無符號原碼,若有符號位要自行去除符號位并根據情況乘以-1(符號位為1,則需將除去符號位的原碼轉化為十進制后再乘以-1);若為補碼,要自行判斷是否需要轉換為原碼(正數的原碼等于補碼)。

    注意:要判斷二進制位數是否有缺,尤其對于有符號位的二進制,若缺位,容易將本來符號位為0的正數當作符號位為1的負數處理。(字符串補零用str.zfill(n),將str數組總位數補到n位)

    啰嗦一句,位數不夠或無符號位,就可以直接轉換;有符號位且位數齊全且符號位為1,則必須注意上述提醒。

    python字符串轉十進制整型

    Python進制轉換和補零_iridescent_mian的博客-CSDN博客_python hex 補0
    (各種進制轉換和類型轉換詳見鏈接)

    從文檔中讀取的數據可能是string格式,運算時需要轉化為可以計算的數值

    注意:str字符串不能直接強制轉換為二進制數,要先轉換為十進制后再轉換為二進制。

    str = "12345" num = int(str) # 轉為整型12345# num_bin = bin(str) # TypeError: 'str' object cannot be interpreted as an integer

    非數值字符串不能轉換,會報錯。

    python截取字符串

    python按照指定字符或者長度 截取字符串 - pager - 博客園

    截取字符串可以按照給定截取字符位置的方式截取:

    如,a為一個字符串,則
    a[0] 為字符串a從左往右數第1個字符
    a[:1]為字符串a從左往右數第1個字符
    a[1:]為字符串a從左往右數從第2個字符開始的所有字符
    a[-1:]為字符串a從右往左數第1個字符
    a[:-1]為字符串a從右往左數第2個字符開始的所有字符(順序不變)

    例:

    a = "Hello"print "a[1:4] 輸出結果:", a[1:4] #結果 ell print "a[:4] 輸出結果:", a[:4] #結果 Hell print "a[1:] 輸出結果:", a[1:] #結果 ello print "a[-1:] 輸出結果:", a[-1:] #結果o print "a[:-1] 輸出結果:", a[:-1] #結果Hell

    截取字符串也可以按照給定截取字符標志的方式截取:
    即根據特定字符為界,截取特定字符之前或之后的字符串。

    例:

    a = "Hello" symbol = 'e' # 截取字符標志# 截取e字符左半部分 a_l = a[:a.index(symbol)] # 截取e字符右半部分,包括e a_r = a[a.index(symbol):]print(a_l) #結果 H print(a_r) #結果 ello

    注:截取字符標志也可以是’\t’等符號。

    python 替換字符串
    temp_str = 'this is a test' print(temp_str.replace('is','IS') print(temp_str) # 輸出 # thIS IS a test # this is a testtemp_str = temp_str.replace('is','IS') print(temp_str) # 輸出 # thIS IS a test

    注意:replace() 不會改變原 string 的內容,要想改變需要重新賦值給原string。

    列表插入元素append

    python中沒有數組的數據結構,可以用列表代替。

    列表的聲明:

    # 聲明一個空列表 a = [] # 聲明一個列表 b = ['3', '4']

    插入元素:

    # 創建列表并增加元素 a = ['!3'] a.append('a') a.append('bc') a.append('123') print(a) # ['!3', 'a', 'bc', '123']# 將第4個元素切片(截取) a[3] = a[3][2:] print(a) # ['!3', 'a', 'bc', '3']
    python 二維列表
    # 聲明一維列表 list1 = []# 聲明二維列表list1,list1含1個列表元素 list1.append([]) list1[0].append('1') list1[0].append(2) # 聲明二維列表list1,list1含2個列表元素 list1.append([]) list1[1].append('3') list1[1].append('4') # 聲明二維列表list1,list1含3個列表元素 list1.append([]) list1[2].append('567')print(len(list1)) print(list1) print(str(list1)) print(int(list1[2][0]))# 結果: # 3 # [['1', 2], ['3', '4'], ['567']] # [['1', 2], ['3', '4'], ['567']] # 567
    python二維列表對應元素相加

    Python之list對應元素求和的方法_python_腳本之家
    方法1:直接用for循環相加
    方法2:用numpy模塊定義數組,數組1+數組2
    方法3:用numpy模塊定義數組,用sum()函數

    import numpy as np a = np.array([1,2,3]) b = np.array([2,3,4]) c = np.array([3,4,5])# 方法2 print(a+b+c) # a+b+c后的類型為numpy.ndarray # 輸出 # [ 6 9 12]# 方法3 print(np.sum([a,b,c], axis = 0)) # axis = 0:縱向求和 # 輸出 # [ 6 9 12]
    encode與decode

    decode的作用是將其他編碼的字符串轉換成Unicode編碼,如str1.decode(‘gb2312’),表示將gb2312編碼的字符串str1轉換成Unicode編碼。

    encode的作用是將unicode編碼轉換成其他編碼的字符串,如str2.encode(‘gb2312’),表示將Unicode編碼的字符串str2轉換成gb2312編碼。

    str1.decode(‘utf-8’):將utf-8編碼的字符串str1轉換成Unicode編碼。

    文件
    讀寫文件(txt、csv、excel)

    Python讀寫文件(csv、txt、excel) - 簡書
    讀寫均由open()實現,結束后要close()關閉文件。

    例:讀text文件

    # 以讀的模式打開文件 f = open('C:/Users/Administrator/Desktop/output.txt', mode='r')# 讀取數據,讀取方式有三種 ftext1 = f.read() # 一次性讀取完成 ftext2 = f.readlines() # 同上 ftext3 = f.readline() # 只讀取1行# 關閉 f.close()

    例:寫text文件

    # 以寫的模式打開文件 f = open('C:/Users/Administrator/Desktop/input.txt', mode='w')# 寫入數據 ftext1 = f.write('hello!') # 一次性讀取完成# 關閉 f.close()

    with open :
    由于文件讀寫時都有可能產生IOError,一旦出錯,后面的f.close()就不會調用。所以,為了保證無論是否出錯都能正確地關閉文件,我們可以使用try … finally來實現,但是每次都這么寫實在太繁瑣,所以,Python引入了with語句來自動幫我們調用close()方法:

    with open('/path/to/file', 'r') as f:print(f.read())

    補充:Python 將數據寫入文件(txt、csv、excel)_菲宇運維-CSDN博客

    文件操作模式


    'w’模式下,每次寫入都會覆蓋原內容,若不想覆蓋原內容,則用’a’模式。

    python跨文件調用函數

    python 一個.py文件如何調用另一個.py文件中的類和函數_winycg的博客-CSDN博客_python 引用另一個py文件
    親測可行,感謝博主

    datetime庫 獲取當前時間

    python獲取當前時間的用法 - 七月曉曉翁 - 博客園

    datetime.datetime.now()

    import datetime t_name = datetime.datetime.strftime(datetime.datetime.now(), '%m%d_%M:%S') print(t_name) # 0727_31:12

    實例鏈接

    計算器GUI實例

    python帶界面的計算器_qq_24624539的博客-CSDN博客_python計算器
    可供小白學習快速熟悉python開發GUI。

    串口調試助手GUI實例

    python實現串口通訊小程序(GUI界面)_明志的博客-CSDN博客_pycharm 開發串口
    該實例能夠滿足最基礎的串口調試功能,發送命令和接收命令需手動操作。還能夠實現串口自動讀取連接。

    讀取串口數據并寫入txt文件

    python讀取串口數據并寫入txt文件

    總結

    以上是生活随笔為你收集整理的python3 GUI用户界面总结(以串口调试为例,持续改进)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 欧洲一区二区在线观看 | 日韩资源在线观看 | 亚洲av成人无码一区二区三区在线观看 | 成人黄色在线视频 | 国产成人精品影院 | 中文字幕国产综合 | 一区二区三区欧美 | 蜜桃成人在线观看 | 亚洲综合激情小说 | 国产在线成人 | 欧美在线视频观看 | 成人免费在线电影 | 日韩av一区在线播放 | 那里可以看毛片 | 涩色网| 亚色一区 | 国产精品性 | 另类视频在线观看+1080p | 日韩在线不卡一区 | 爱色成人网 | 91成人在线看 | 国产精品久久久久久久av福利 | 国产香蕉尹人视频在线 | 在线观看免费黄色 | 欧美日韩在线综合 | 一区二区日韩国产 | 天天操夜夜爽 | 日韩色一区 | 国产一区在线不卡 | 日韩毛片大全 | 激情久久免费视频 | 大咪咪av | 亚洲 小说 欧美 激情 另类 | 国产免费片 | 国产欧美一区二区 | 国产99热 | 伊人黄| 黄色资源在线观看 | 日韩一级理论片 | av这里只有精品 | 欧美在线xxxx | 91精品啪在线观看国产 | 狠狠爱免费视频 | 狠狠操人人干 | 亚洲国产av一区 | 91在线视频免费播放 | 一级性生活大片 | 中文字幕视频免费 | 狠狠躁夜夜躁人人爽视频 | 操操色 | 色综合视频在线 | 丁香花完整视频在线观看 | 毛片基地免费观看 | 999视频在线播放 | 人妖粗暴刺激videos呻吟 | 成人啪啪网站 | 中文字幕亚洲高清 | 四虎久久久久 | 久久作爱 | 中文字幕岛国 | 久久激情久久 | 流白浆视频| 色综合天天操 | 国产免费久久精品国产传媒 | 久久成人乱码欧美精品一区二区 | 日本网站在线免费观看 | 国产精品偷伦视频免费观看了 | 成人网在线视频 | 手机在线中文字幕 | 成人在线免费播放 | 色综合网站| 懂色av一区二区三区在线播放 | 狠狠躁18三区二区一区 | 九九热在线观看视频 | 蜜桃av乱码一区二区三区 | 开心激情网五月天 | 国产乱妇无码大片在线观看 | 欧美黑人孕妇孕交 | 精品无码久久久久久久 | 久热色 | 亚洲AV综合色区无码国产播放 | 白嫩初高中害羞小美女 | 中文字幕久久综合 | 黄色成人免费网站 | 牛牛在线免费视频 | 波多野结衣mp4 | 九九热色 | 四虎永久网站 | av大全免费| 国产123区在线观看 91国产一区二区 | 麻豆av免费在线观看 | 久久澡 | 美女黄色一级 | 伊人超碰在线 | 91在线观看免费高清完整版在线观看 | 中文av在线播放 | 国产嫩草视频 | 日本天堂在线播放 | 日本学生初尝黑人巨免费视频 |