使用Python開(kāi)發(fā)一個(gè)智能桌面單詞記憶工具
一、概述:當(dāng)單詞記憶遇上Python GUI
在英語(yǔ)學(xué)習(xí)過(guò)程中,高頻重復(fù)是記憶單詞的關(guān)鍵。傳統(tǒng)背單詞軟件往往需要用戶主動(dòng)打開(kāi)應(yīng)用,而本項(xiàng)目的創(chuàng)新之處在于開(kāi)發(fā)了一個(gè)桌面懸浮窗單詞記憶工具,具有以下核心特點(diǎn):
- 無(wú)干擾學(xué)習(xí):半透明懸浮窗始終置頂顯示
- 智能記憶算法:支持順序/逆序/隨機(jī)三種循環(huán)模式
- 快捷交互:F8熱鍵一鍵切換中英釋義
- 高度可定制:字體/顏色/間隔時(shí)間全面可配置
- 輕量化設(shè)計(jì):系統(tǒng)托盤(pán)運(yùn)行,內(nèi)存占用<50MB
本文將深入解析200+行代碼的實(shí)現(xiàn)原理,并提供完整的可執(zhí)行方案。
二、功能架構(gòu)設(shè)計(jì)
2.1 核心功能模塊
單詞顯示模塊
- 定時(shí)切換顯示
- 中英雙語(yǔ)切換
- 視覺(jué)樣式定制
交互控制模塊
- 全局熱鍵監(jiān)聽(tīng)
- 拖拽移動(dòng)窗口
- 系統(tǒng)托盤(pán)菜單
配置管理模塊
- QSettings持久化
- 詞庫(kù)動(dòng)態(tài)加載
- 設(shè)置實(shí)時(shí)生效
2.2 技術(shù)選型對(duì)比
技術(shù)方案 | 優(yōu)勢(shì) | 本項(xiàng)目選擇原因 |
---|---|---|
PyQt5 | 成熟GUI框架 | 跨平臺(tái)支持好 |
pynput | 全局熱鍵監(jiān)聽(tīng) | 比win32api更簡(jiǎn)潔 |
QSettings | 配置存儲(chǔ) | 無(wú)需額外數(shù)據(jù)庫(kù) |
三、效果展示
3.1 主界面效果
3.2 設(shè)置面板
3.3 系統(tǒng)托盤(pán)菜單
四、實(shí)現(xiàn)步驟詳解
4.1 環(huán)境準(zhǔn)備
pip install PyQt5 pynput
4.2 詞庫(kù)文件格式
創(chuàng)建words.txt(每行一個(gè)單詞+釋義):
apple 蘋(píng)果
banana 香蕉
4.3 核心類(lèi)解析
4.3.1 熱鍵監(jiān)聽(tīng)線程
class HotkeyWorker(QObject): toggle_signal = pyqtSignal() def run(self): from pynput import keyboard def on_activate_f8(): self.toggle_signal.emit() with keyboard.GlobalHotKeys({'<F8>': on_activate_f8}) as listener: listener.join()
關(guān)鍵點(diǎn):
- 使用QObject實(shí)現(xiàn)跨線程信號(hào)通信
- pynput庫(kù)實(shí)現(xiàn)全局熱鍵監(jiān)聽(tīng)
- 異常處理保障穩(wěn)定性
4.3.2 主窗口類(lèi)
class WordDisplayApp(QMainWindow): def __init__(self): super().__init__() self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint) self.setAttribute(Qt.WA_TranslucentBackground)
窗口特性:
- FramelessWindowHint:無(wú)邊框
- WindowStaysOnTopHint:始終置頂
- WA_TranslucentBackground:半透明效果
4.4 配置持久化實(shí)現(xiàn)
self.settings = QSettings("WordDisplay", "WordDisplayApp") # 保存配置 self.settings.setValue("interval", self.interval) # 讀取配置 self.interval = self.settings.value("interval", 5, type=int)
存儲(chǔ)位置:
- Windows:注冊(cè)表HKEY_CURRENT_USER\Software\WordDisplay\WordDisplayApp
- Mac:~/Library/Preferences/com.WordDisplay.WordDisplayApp.plist
五、代碼深度解析
5.1 單詞加載算法
def load_words(self): if self.order == "reverse": self.word_list.reverse() elif self.order == "random": random.shuffle(self.word_list)
記憶算法優(yōu)化:
- 隨機(jī)模式:避免固定順序記憶
- 逆序模式:強(qiáng)化尾部單詞記憶
- 間隔重復(fù):通過(guò)定時(shí)器控制顯示節(jié)奏
5.2 拖拽移動(dòng)實(shí)現(xiàn)
def mousePressEvent(self, event): self.dragging = True self.offset = event.globalPos() - self.pos() def mouseMoveEvent(self, event): if self.dragging: self.move(event.globalPos() - self.offset)
交互細(xì)節(jié):
- 記錄鼠標(biāo)點(diǎn)擊位置與窗口位置的偏移量
- 實(shí)時(shí)計(jì)算新窗口位置
- 鼠標(biāo)釋放時(shí)重置狀態(tài)
5.3 系統(tǒng)托盤(pán)集成
self.tray_icon = QSystemTrayIcon(self) tray_menu = QMenu() exit_action = QAction("退出", self) exit_action.triggered.connect(self.quit_app) tray_menu.addAction(exit_action)
多平臺(tái)適配:
- Windows/Mac/Linux通用實(shí)現(xiàn)
- 雙擊圖標(biāo)顯示/隱藏窗口
- 右鍵彈出功能菜單
六、完整源碼下載
import sys import random import os from PyQt5.QtWidgets import (QApplication, QMainWindow, QLabel, QSystemTrayIcon, QMenu, QAction, QWidget, QVBoxLayout, QPushButton, QSpinBox, QComboBox, QColorDialog, QMessageBox, QDesktopWidget, QFileDialog) from PyQt5.QtGui import QColor, QFont, QIcon, QPixmap, QCursor from PyQt5.QtCore import Qt, QTimer, QSettings, QSize, QThread, pyqtSignal, QObject, QPoint class HotkeyWorker(QObject): """處理全局快捷鍵的工作線程""" toggle_signal = pyqtSignal() error_signal = pyqtSignal(str) def __init__(self): super().__init__() self.listener = None def run(self): """啟動(dòng)熱鍵監(jiān)聽(tīng)""" try: from pynput import keyboard def on_activate_f8(): self.toggle_signal.emit() with keyboard.GlobalHotKeys({'<F8>': on_activate_f8}) as self.listener: self.listener.join() except ImportError as e: self.error_signal.emit("未安裝pynput庫(kù),無(wú)法使用F8快捷鍵功能") except Exception as e: self.error_signal.emit(f"快捷鍵初始化失敗: {str(e)}") def stop(self): """停止熱鍵監(jiān)聽(tīng)""" if self.listener: self.listener.stop() class WordDisplayApp(QMainWindow): def __init__(self): super().__init__() # 初始化設(shè)置 self.settings = QSettings("WordDisplay", "WordDisplayApp") self.load_settings() # 初始化UI self.init_ui() # 加載單詞數(shù)據(jù) self.word_list = [] self.current_word_file = "words.txt" # 默認(rèn)詞庫(kù)文件 self.load_words() # 設(shè)置當(dāng)前單詞索引 self.current_index = 0 # 顯示第一個(gè)單詞 self.show_word() # 設(shè)置定時(shí)器 self.timer = QTimer() self.timer.timeout.connect(self.show_next_word) self.timer.start(self.interval * 1000) # 中文釋義是否顯示 self.show_translation = False # 初始化熱鍵線程 self.init_hotkey_thread() # 拖動(dòng)相關(guān)變量 self.dragging = False self.offset = QPoint() def init_hotkey_thread(self): """初始化熱鍵監(jiān)聽(tīng)線程""" self.hotkey_thread = QThread() self.hotkey_worker = HotkeyWorker() self.hotkey_worker.moveToThread(self.hotkey_thread) # 連接信號(hào) self.hotkey_worker.toggle_signal.connect(self.toggle_translation) self.hotkey_worker.error_signal.connect(self.show_error_message) # 啟動(dòng)線程 self.hotkey_thread.started.connect(self.hotkey_worker.run) self.hotkey_thread.start() def show_error_message(self, message): """顯示錯(cuò)誤消息""" QMessageBox.warning(self, "警告", message) def init_ui(self): """初始化用戶界面""" self.setWindowTitle("單詞顯示") self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint | Qt.Tool) self.setAttribute(Qt.WA_TranslucentBackground) # 創(chuàng)建主部件 main_widget = QWidget() self.setCentralWidget(main_widget) # 布局 layout = QVBoxLayout() layout.setContentsMargins(10, 10, 10, 10) main_widget.setLayout(layout) # 英文單詞標(biāo)簽 self.word_label = QLabel("單詞加載中...") self.word_label.setAlignment(Qt.AlignCenter) self.word_label.setFont(QFont("Arial", self.english_font_size)) self.word_label.setStyleSheet(f"color: {self.word_color.name()};") # 中文翻譯標(biāo)簽 self.translation_label = QLabel() self.translation_label.setAlignment(Qt.AlignCenter) self.translation_label.setFont(QFont("微軟雅黑", self.chinese_font_size)) self.translation_label.setStyleSheet(f"color: {self.translation_color.name()};") self.translation_label.hide() # 添加到布局 layout.addWidget(self.word_label) layout.addWidget(self.translation_label) # 系統(tǒng)托盤(pán)圖標(biāo) self.init_system_tray() # 移動(dòng)到右上角 self.move_to_top_right() def init_system_tray(self): """初始化系統(tǒng)托盤(pán)圖標(biāo)""" self.tray_icon = QSystemTrayIcon(self) # 設(shè)置圖標(biāo) icon_path = os.path.join(os.path.dirname(__file__), "icon.ico") if os.path.exists(icon_path): self.tray_icon.setIcon(QIcon(icon_path)) else: # 創(chuàng)建默認(rèn)圖標(biāo) pixmap = QPixmap(QSize(64, 64)) pixmap.fill(Qt.transparent) self.tray_icon.setIcon(QIcon(pixmap)) QMessageBox.warning(self, "圖標(biāo)未找到", f"未找到圖標(biāo)文件: {icon_path}") # 創(chuàng)建托盤(pán)菜單 tray_menu = QMenu() # 顯示/隱藏主窗口 toggle_action = QAction("顯示/隱藏", self) toggle_action.triggered.connect(self.toggle_visibility) tray_menu.addAction(toggle_action) # 重置位置 reset_pos_action = QAction("重置位置", self) reset_pos_action.triggered.connect(self.move_to_top_right) tray_menu.addAction(reset_pos_action) # 設(shè)置 settings_action = QAction("設(shè)置", self) settings_action.triggered.connect(self.show_settings_dialog) tray_menu.addAction(settings_action) # 加載詞庫(kù) load_dict_action = QAction("加載詞庫(kù)", self) load_dict_action.triggered.connect(self.load_new_dictionary) tray_menu.addAction(load_dict_action) # 退出 exit_action = QAction("退出", self) exit_action.triggered.connect(self.quit_app) tray_menu.addAction(exit_action) self.tray_icon.setContextMenu(tray_menu) self.tray_icon.show() # 托盤(pán)圖標(biāo)點(diǎn)擊事件 self.tray_icon.activated.connect(self.on_tray_icon_activated) def on_tray_icon_activated(self, reason): """托盤(pán)圖標(biāo)點(diǎn)擊事件處理""" if reason == QSystemTrayIcon.DoubleClick: self.toggle_visibility() def move_to_top_right(self): """將窗口移動(dòng)到屏幕右上角""" screen = QDesktopWidget().screenGeometry() self.move(screen.width() - self.width() - 20, 20) def mousePressEvent(self, event): """鼠標(biāo)按下事件""" if event.button() == Qt.LeftButton: self.dragging = True self.offset = event.globalPos() - self.pos() event.accept() self.setCursor(QCursor(Qt.SizeAllCursor)) def mouseMoveEvent(self, event): """鼠標(biāo)移動(dòng)事件""" if self.dragging and event.buttons() & Qt.LeftButton: self.move(event.globalPos() - self.offset) event.accept() def mouseReleaseEvent(self, event): """鼠標(biāo)釋放事件""" if event.button() == Qt.LeftButton: self.dragging = False self.setCursor(QCursor(Qt.ArrowCursor)) event.accept() def load_words(self, file_path=None): """從文件加載單詞數(shù)據(jù)""" try: if file_path is None: file_path = self.current_word_file with open(file_path, "r", encoding="utf-8") as f: self.word_list = [] for line in f: line = line.strip() if line: parts = line.split(maxsplit=1) if len(parts) == 2: self.word_list.append({ "word": parts[0], "translation": parts[1] }) # 根據(jù)順序設(shè)置處理單詞列表 if self.order == "reverse": self.word_list.reverse() elif self.order == "random": random.shuffle(self.word_list) if not self.word_list: self.word_list.append({ "word": "示例單詞", "translation": "example translation" }) except FileNotFoundError: QMessageBox.critical(self, "錯(cuò)誤", f"未找到詞庫(kù)文件: {file_path}") self.word_list = [{ "word": "示例單詞", "translation": "example translation" }] except Exception as e: QMessageBox.critical(self, "錯(cuò)誤", f"加載詞庫(kù)失敗: {str(e)}") self.word_list = [{ "word": "加載失敗", "translation": "load failed" }] def load_new_dictionary(self): """加載新的詞庫(kù)文件""" file_path, _ = QFileDialog.getOpenFileName( self, "選擇詞庫(kù)文件", "", "文本文件 (*.txt);;所有文件 (*)" ) if file_path: self.current_word_file = file_path self.load_words(file_path) self.current_index = 0 self.show_word() # 保存當(dāng)前詞庫(kù)路徑 self.settings.setValue("current_word_file", file_path) def show_word(self): """顯示當(dāng)前單詞""" if not self.word_list: return word_data = self.word_list[self.current_index] self.word_label.setText(word_data["word"]) self.translation_label.setText(word_data["translation"]) def show_next_word(self): """顯示下一個(gè)單詞""" if not self.word_list: return if self.order == "random": self.current_index = random.randint(0, len(self.word_list) - 1) else: self.current_index += 1 if self.current_index >= len(self.word_list): self.current_index = 0 self.show_word() def toggle_translation(self): """切換翻譯顯示狀態(tài)""" self.show_translation = not self.show_translation self.translation_label.setVisible(self.show_translation) # 根據(jù)翻譯顯示狀態(tài)控制定時(shí)器 if self.show_translation: self.timer.stop() # 顯示翻譯時(shí)暫停計(jì)時(shí)器 else: self.timer.start(self.interval * 1000) # 隱藏翻譯時(shí)恢復(fù)計(jì)時(shí)器 def show_settings_dialog(self): """顯示設(shè)置對(duì)話框""" self.settings_dialog = QWidget() self.settings_dialog.setWindowTitle("設(shè)置") self.settings_dialog.setWindowModality(Qt.ApplicationModal) self.settings_dialog.setFixedSize(350, 450) layout = QVBoxLayout() layout.setContentsMargins(10, 10, 10, 10) # 間隔時(shí)間設(shè)置 interval_label = QLabel("顯示間隔(秒):") self.interval_spinbox = QSpinBox() self.interval_spinbox.setRange(1, 3600) self.interval_spinbox.setValue(self.interval) # 單詞順序設(shè)置 order_label = QLabel("單詞順序:") self.order_combobox = QComboBox() self.order_combobox.addItems(["順序", "逆序", "隨機(jī)"]) self.order_combobox.setCurrentIndex(["normal", "reverse", "random"].index(self.order)) # 英文字體大小設(shè)置 english_fontsize_label = QLabel("英文單詞字體大小:") self.english_fontsize_spinbox = QSpinBox() self.english_fontsize_spinbox.setRange(8, 72) self.english_fontsize_spinbox.setValue(self.english_font_size) # 中文字體大小設(shè)置 chinese_fontsize_label = QLabel("中文翻譯字體大小:") self.chinese_fontsize_spinbox = QSpinBox() self.chinese_fontsize_spinbox.setRange(8, 72) self.chinese_fontsize_spinbox.setValue(self.chinese_font_size) # 單詞顏色設(shè)置 word_color_label = QLabel("單詞顏色:") self.word_color_button = QPushButton() self.word_color_button.setStyleSheet(f"background-color: {self.word_color.name()};") self.word_color_button.clicked.connect(lambda: self.choose_color("word")) # 翻譯顏色設(shè)置 trans_color_label = QLabel("翻譯顏色:") self.trans_color_button = QPushButton() self.trans_color_button.setStyleSheet(f"background-color: {self.translation_color.name()};") self.trans_color_button.clicked.connect(lambda: self.choose_color("translation")) # 保存按鈕 save_button = QPushButton("保存設(shè)置") save_button.clicked.connect(self.save_settings) # 重新加載當(dāng)前詞庫(kù)按鈕 reload_button = QPushButton("重新加載當(dāng)前詞庫(kù)") reload_button.clicked.connect(lambda: self.load_words(self.current_word_file)) # 添加到布局 layout.addWidget(interval_label) layout.addWidget(self.interval_spinbox) layout.addWidget(order_label) layout.addWidget(self.order_combobox) layout.addWidget(english_fontsize_label) layout.addWidget(self.english_fontsize_spinbox) layout.addWidget(chinese_fontsize_label) layout.addWidget(self.chinese_fontsize_spinbox) layout.addWidget(word_color_label) layout.addWidget(self.word_color_button) layout.addWidget(trans_color_label) layout.addWidget(self.trans_color_button) layout.addWidget(save_button) layout.addWidget(reload_button) layout.addStretch() self.settings_dialog.setLayout(layout) self.settings_dialog.show() def choose_color(self, color_type): """選擇顏色""" color = QColorDialog.getColor() if color.isValid(): if color_type == "word": self.word_color = color self.word_color_button.setStyleSheet(f"background-color: {color.name()};") else: self.translation_color = color self.trans_color_button.setStyleSheet(f"background-color: {color.name()};") def save_settings(self): """保存設(shè)置""" self.interval = self.interval_spinbox.value() order_index = self.order_combobox.currentIndex() if order_index == 0: self.order = "normal" elif order_index == 1: self.order = "reverse" else: self.order = "random" self.english_font_size = self.english_fontsize_spinbox.value() self.chinese_font_size = self.chinese_fontsize_spinbox.value() # 保存到QSettings self.settings.setValue("interval", self.interval) self.settings.setValue("order", self.order) self.settings.setValue("english_font_size", self.english_font_size) self.settings.setValue("chinese_font_size", self.chinese_font_size) self.settings.setValue("word_color", self.word_color.name()) self.settings.setValue("translation_color", self.translation_color.name()) # 應(yīng)用設(shè)置 self.apply_settings() self.settings_dialog.close() def apply_settings(self): """應(yīng)用當(dāng)前設(shè)置""" # 更新定時(shí)器間隔 self.timer.stop() if not self.show_translation: # 只有隱藏翻譯時(shí)才啟動(dòng)計(jì)時(shí)器 self.timer.start(self.interval * 1000) # 更新字體大小 self.word_label.setFont(QFont("Arial", self.english_font_size)) self.translation_label.setFont(QFont("微軟雅黑", self.chinese_font_size)) # 更新顏色 self.word_label.setStyleSheet(f"color: {self.word_color.name()};") self.translation_label.setStyleSheet(f"color: {self.translation_color.name()};") # 如果需要,重新排序單詞 if self.order == "reverse": self.word_list.reverse() elif self.order == "random": random.shuffle(self.word_list) # 重置索引 self.current_index = 0 self.show_word() def toggle_visibility(self): """切換窗口可見(jiàn)性""" if self.isVisible(): self.hide() else: self.show() self.move_to_top_right() def quit_app(self): """退出應(yīng)用程序""" # 停止熱鍵線程 if hasattr(self, 'hotkey_thread'): self.hotkey_worker.stop() self.hotkey_thread.quit() self.hotkey_thread.wait() # 保存設(shè)置 self.settings.sync() QApplication.quit() def closeEvent(self, event): """重寫(xiě)關(guān)閉事件""" event.ignore() self.hide() def load_settings(self): """加載設(shè)置""" # 默認(rèn)設(shè)置 self.interval = self.settings.value("interval", 5, type=int) self.order = self.settings.value("order", "normal") self.english_font_size = self.settings.value("english_font_size", 24, type=int) self.chinese_font_size = self.settings.value("chinese_font_size", 20, type=int) self.current_word_file = self.settings.value("current_word_file", "words.txt") # 顏色設(shè)置 self.word_color = QColor(self.settings.value("word_color", "#000000")) self.translation_color = QColor(self.settings.value("translation_color", "#888888")) if __name__ == "__main__": app = QApplication(sys.argv) app.setQuitOnLastWindowClosed(False) # 設(shè)置應(yīng)用程序圖標(biāo) icon_path = os.path.join(os.path.dirname(__file__), "icon.ico") if os.path.exists(icon_path): app.setWindowIcon(QIcon(icon_path)) word_app = WordDisplayApp() word_app.hide() sys.exit(app.exec_())
項(xiàng)目結(jié)構(gòu):
word-display/
├── main.py # 主程序
├── words.txt # 示例詞庫(kù)
├── icon.ico # 程序圖標(biāo)
└── requirements.txt # 依賴庫(kù)
七、擴(kuò)展開(kāi)發(fā)建議
7.1 功能增強(qiáng)方向
記憶曲線算法:根據(jù)艾賓浩斯曲線調(diào)整單詞出現(xiàn)頻率
云端同步:增加詞庫(kù)網(wǎng)絡(luò)同步功能
發(fā)音功能:集成TTS引擎朗讀單詞
7.2 性能優(yōu)化建議
# 使用LRU緩存最近顯示的單詞 from functools import lru_cache @lru_cache(maxsize=50) def get_word_style(word): return generate_style(word)
八、總結(jié)
本文詳細(xì)解析了基于PyQt5的單詞記憶工具開(kāi)發(fā)全過(guò)程,關(guān)鍵技術(shù)點(diǎn)包括:
- 多線程熱鍵監(jiān)聽(tīng)的實(shí)現(xiàn)方案
- QSettings配置持久化的最佳實(shí)踐
- 無(wú)邊框窗口的交互細(xì)節(jié)處理
- 系統(tǒng)托盤(pán)應(yīng)用的開(kāi)發(fā)模式
該項(xiàng)目的創(chuàng)新價(jià)值在于:
- 將被動(dòng)記憶轉(zhuǎn)化為主動(dòng)感知
- 極簡(jiǎn)主義設(shè)計(jì)哲學(xué)的應(yīng)用
- 可擴(kuò)展的架構(gòu)設(shè)計(jì)
到此這篇關(guān)于使用Python開(kāi)發(fā)一個(gè)智能桌面單詞記憶工具的文章就介紹到這了,更多相關(guān)Python桌面單詞工具內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)將Excel內(nèi)容插入到Word模版中
前段時(shí)間因?yàn)樾枰幚硪淮蠖羊?yàn)收單,都是一些簡(jiǎn)單的復(fù)制粘貼替換工作,于是就想到用python進(jìn)行處理。本文分享了用python將excel文件單元格內(nèi)容插入到word模版中并保存為新文件的辦法,希望對(duì)大家有所幫助2023-03-03多線程爬蟲(chóng)批量下載pcgame圖片url 保存為xml的實(shí)現(xiàn)代碼
用Python寫(xiě)的多線程爬蟲(chóng)批量下載pcgame的圖片url并保存為xml格式,主要是邏輯代碼,喜歡的朋友可以測(cè)試下2013-01-01Python 數(shù)據(jù)處理庫(kù) pandas進(jìn)階教程
在前面一篇文章中,我們對(duì)pandas做了一些入門(mén)介紹。本文是它的進(jìn)階篇。在這篇文章中,我們會(huì)講解一些更深入的知識(shí)2018-04-04python 數(shù)據(jù)庫(kù)查詢返回list或tuple實(shí)例
這篇文章主要介紹了python 數(shù)據(jù)庫(kù)查詢返回list或tuple實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05Pycharm使用爬蟲(chóng)時(shí)遇到etree紅線問(wèn)題及解決
這篇文章主要介紹了Pycharm使用爬蟲(chóng)時(shí)遇到etree紅線問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05簡(jiǎn)單講解Python中的字符串與字符串的輸入輸出
這篇文章主要介紹了Python中的字符串與字符串的輸入輸出,Python3.x版本中默認(rèn)以Unicode為編碼,省去了不少麻煩,需要的朋友可以參考下2016-03-03