最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

利用PyCharm設(shè)計(jì)簡(jiǎn)單的不重復(fù)單詞抽取器

2023-03-11 21:39 作者:Z1-4  | 我要投稿

由于一人聽寫單詞需要,想設(shè)計(jì)一個(gè)不重復(fù)單詞抽取器??戳诵∑普镜母鞣N視頻,加上對(duì)于相關(guān)包信息的搜集,制作了一個(gè)簡(jiǎn)易版的小程序。寫篇小文章來(lái)記錄一下過(guò)程。

相關(guān)源碼、最終效果圖和相關(guān)資源網(wǎng)址放在本文的最后。

目錄

??????????????????????????????????????????????????????????1.預(yù)備操作

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2.背景的導(dǎo)入

??????????????????????????????????????????????????????????3.按鈕與顯示界面設(shè)計(jì)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 4.源碼、效果圖和參考網(wǎng)址

  1. 預(yù)備操作:

    導(dǎo)入相關(guān)模塊和包,代碼如下:

    import tkinter as tk#導(dǎo)入繪制界面庫(kù)
    import random#導(dǎo)入隨機(jī)函數(shù)使用
    from PIL import ImageTk,Image#繪背景圖使用
    from tkinter import filedialog#導(dǎo)入文件使用
    import copy#重新開始功能使用
    import pygame as py#導(dǎo)入音樂(lè)使用

  2. 背景的導(dǎo)入:

    (1)在導(dǎo)入背景之前,需要初始化一個(gè)窗口實(shí)例,對(duì)窗口實(shí)例進(jìn)行初始化操作:添加標(biāo)題文字(title()函數(shù))、窗體大?。╣eometry()函數(shù))。注意若要調(diào)整窗口為600*600的,參數(shù)應(yīng)該使用“600x600”而不能使用“600*600”(x為英文字母x).

    代碼如下:

    root=tk.Tk()#初始化一個(gè)窗口實(shí)例,名字為root
    root.title("隨機(jī)抽取")#添加標(biāo)題文字
    root.geometry('600x600')#設(shè)置窗體大小

    (2)導(dǎo)入背景前先將背景圖片保存到本地的某個(gè)地方。使用Image中的open()函數(shù)打開背景圖片(使用絕對(duì)路徑),使用resize()函數(shù)調(diào)整圖片的大小。然后使用PhotoImage()函數(shù)提取圖片像素建立新圖片。注意這里不能使用tk中的PhotoImage()函數(shù)而要使用ImageTk中的PhotoImage()函數(shù),前者支持gif形式的圖片,本文采用jpg圖片,使用后者。

    然后使用tk中的label()函數(shù)對(duì)圖像進(jìn)行繪制。

    具體代碼如下:

    #導(dǎo)入背景圖片
    img=Image.open(r"C:\Users\86157\Desktop\隨機(jī)單詞抽取\1.jpg")
    img=img.resize((600,600))
    photo = ImageTk.PhotoImage(img)
    tk.Label(master=root,image=photo).grid(row=0, column=0)

    效果圖如下:

背景效果圖
(3)

3.按鈕與顯示界面設(shè)計(jì)

(1)顯示界面設(shè)計(jì)

????抽取的結(jié)果要顯示在屏幕上,使用tk中的StringVar()實(shí)現(xiàn),先進(jìn)行初始化,使用set()函數(shù)設(shè)置未抽取時(shí)的內(nèi)容。然后對(duì)字體(本文使用黑體)進(jìn)行調(diào)整,并使用place()函數(shù)將其放置在畫布的某個(gè)位置。

????代碼如下:

????num = tk.StringVar()
????num.set('目前還未抽取')
????label = tk.Label(root, textvariable=num, font=("SimHei", 40))
????label.place(x=50, y=120)

????同理設(shè)計(jì)顯示已經(jīng)抽出的單詞的個(gè)數(shù)。

????代碼如下:

????num2 = tk.StringVar()
????num2.set("已抽取個(gè)數(shù):"+str(age))
????label = tk.Label(root, textvariable=num2, font=("SimHei", 40))
????label.place(x=50, y=30)

????效果圖如下:

顯示界面效果圖

(2)按鈕設(shè)置

????按鈕一共分為四個(gè),隨機(jī)抽取,重新抽取,導(dǎo)入文件,開關(guān)音樂(lè)。

????首先,定義三個(gè)列表L,L2,L3三者均為空列表,L用于存放抽取的數(shù)據(jù),L2和L3重新抽取中對(duì)L中的內(nèi)容進(jìn)行修正。

????代碼如下:

????L,L2,L3=[],[],[]

????1.導(dǎo)入文件:自定義getfile()函數(shù)

????使用global將全局變量L,L2,L3調(diào)入到函數(shù)內(nèi)部進(jìn)行使用。然后使用askopenfilename()函數(shù)導(dǎo)入文件,將導(dǎo)入的文件的絕對(duì)路徑返回給一個(gè)變量,接著使用路徑來(lái)打開相應(yīng)的文件。本文使用文本文件txt,文件中的文本形式類似為:“1.學(xué)生\n”,因此需要對(duì)每一行取出的字符進(jìn)行分離操作,使用split()函數(shù)分離兩次就得到了“學(xué)生”,將其存添加到空列表L中,重復(fù)這個(gè)過(guò)程直到?jīng)]有元素可以添加了,然后將L進(jìn)行深拷貝,存儲(chǔ)在L2中。

????代碼如下:

????def getfile():
? ?????global L,L2,L3
? ?????L,L2,L3=[],[],[]
? ?????file_path=filedialog.askopenfilename()
? ?????with open(file_path, encoding="utf-8") as file:
? ? ? ?????while (1):
? ? ? ? ? ?????result = file.readline()
? ? ? ? ? ?????result1 = result.split("\n")[0]
? ? ? ? ? ?????result2 = result1.split(".")[-1]
? ? ? ? ? ?????if (result):
? ? ? ? ? ? ? ?????L.append(result2)
? ? ? ? ? ?????else:
? ? ? ? ? ? ? ?????L2 = copy.deepcopy(L)
? ? ? ? ? ? ? ?????break

????當(dāng)按下“隨機(jī)抽取按鈕之后”,才會(huì)調(diào)用上述函數(shù),因此上述函數(shù)時(shí)點(diǎn)擊按鈕時(shí)發(fā)生的事件。按鈕采用tk.Button()函數(shù)進(jìn)行調(diào)用,command參數(shù)使用lambda函數(shù),點(diǎn)擊后具體的操作為getfile()函數(shù)。然后將按鈕放在界面合適的位置即可。

????代碼如下:

????button3=tk.Button(root,text="導(dǎo)入文件",font=("Microsoft ????????SimHei",28),command=lambda:getfile())
????button3.place(x=135,y=415)

????2.隨機(jī)抽取

????在導(dǎo)入文件之后,列表L中就存放了所有帶抽取的單詞。在抽取過(guò)程中需要不斷改變顯示的數(shù)據(jù)以及已經(jīng)抽取元素的個(gè)數(shù)。定義一個(gè)全局變量age用于存放已經(jīng)抽取元素個(gè)數(shù),將全局變量age(統(tǒng)計(jì)抽取個(gè)數(shù))和num2(顯示內(nèi)容)在抽取單詞的getcharacters()函數(shù)內(nèi)部調(diào)用。

????每一次進(jìn)行抽取,顯示已經(jīng)抽取元素的個(gè)數(shù)會(huì)增加,列表中元素會(huì)減少,顯示內(nèi)容會(huì)改變。因此每次操作需更改三部分,顯示內(nèi)容更改可以在函數(shù)體外得到,故不寫入該函數(shù)中。將列表長(zhǎng)度作為條件判斷,當(dāng)列表長(zhǎng)度為0時(shí)候,抽取完畢返回信息;當(dāng)列表長(zhǎng)度不為0時(shí)候,利用random.randint()函數(shù)隨機(jī)抽取一個(gè)整數(shù),age自增,然后在num2中顯示age的值,接著將數(shù)刪除并作為函數(shù)的返回值。注意不能先刪除再返回,刪除和返回需要同一個(gè)值,可以使用pop()函數(shù)或者remove()函數(shù)等。

????代碼如下:

????def getcharacters(L):
? ?????global age,num2
? ?????length=len(L)#列表長(zhǎng)度
? ?????if(length!=0):
? ? ? ?????number = random.randint(0, length-1) ?# 所取得序號(hào)
? ? ? ?????age=age+1
? ? ? ?????num2.set("已抽取個(gè)數(shù):"+str(age))
? ? ? ?????return L.pop(number)
? ?????else:
? ? ? ?????return "抽取完畢!"

????與上述設(shè)計(jì)按鈕同理,這里的getcharacters()只是點(diǎn)擊按鈕時(shí)調(diào)用的函數(shù),仍需要設(shè)計(jì)按鈕。仍使用tk.Button()函數(shù),command中調(diào)用lambda函數(shù),這里需要將選出來(lái)的單詞顯示在num中,即需要抽取字符并且顯示,故使用num.set(str(getcharacters())),在調(diào)用gethcharacters后并輸出到屏幕上,然后調(diào)整按鈕位置。(str在這里多余,若要抽取其他類型,如整型數(shù)據(jù)可以加上)

????代碼如下:

????button=tk.Button(root,text="隨機(jī)抽取",font=("Microsoft SimHei",28),command=lambda:num.set(str(getcharacters(L))))
????button.place(x=135,y=215)

????3.開關(guān)音樂(lè)

????由于作者水平受限,開關(guān)音樂(lè)時(shí)只能做到重新播放和關(guān)閉。

????設(shè)置一個(gè)flag來(lái)實(shí)現(xiàn)音樂(lè)的開關(guān)。當(dāng)打開程序時(shí),音樂(lè)自動(dòng)播放,使用py中的init()函數(shù)進(jìn)行初始化,然后使用load()函數(shù)導(dǎo)入對(duì)應(yīng)的音頻文件,然后使用play()函數(shù)進(jìn)行播放,第一個(gè)參數(shù)設(shè)置為-1表示循環(huán)播放,第二個(gè)參數(shù)設(shè)置為0,表示從第0秒開始。

????點(diǎn)擊按鈕所調(diào)用的函數(shù)為stop_openmusic(),當(dāng)flag=1的時(shí)候點(diǎn)擊,使用stop()函數(shù)停止音樂(lè),同時(shí)將flag的值調(diào)整為0,;當(dāng)flag=0的時(shí)候點(diǎn)擊,模仿開始時(shí)播放音樂(lè)的步驟即可。

????代碼如下:

????flag=1
????py.mixer.init()
????py.mixer.music.load(r"C:\Users\86157\Desktop\隨機(jī)單詞抽取\音樂(lè).mp3")
????py.mixer.music.play(-1, 0)
????def stop_openmusic():
? ?????global flag
? ?????if(flag==1):
? ? ? ?????py.mixer.music.stop()
? ? ? ?????flag=0
? ?????else:
? ? ? ?????py.mixer.init()
? ? ? ?????py.mixer.music.load(r"C:\Users\86157\Desktop\隨機(jī)單詞抽取\音樂(lè).mp3")
? ? ? ?????py.mixer.music.play(-1, 0)
? ? ? ?????flag=1

????按鈕設(shè)置與上述按鈕設(shè)置同理,直接放代碼:

????button3=tk.Button(root,text="開關(guān)音樂(lè)",font=("Microsoft SimHei",28),command=lambda:stop_openmusic())
????button3.place(x=135,y=515)

????4.重新抽取

????重新抽取的過(guò)程就是將L的內(nèi)容變成與初始導(dǎo)入時(shí)候一樣的內(nèi)容,并且調(diào)整num2中顯示已經(jīng)抽取元素的個(gè)數(shù)的過(guò)程。再抽取過(guò)程中L發(fā)生改變,L2是L的深拷貝,若使用單純的賦值操作,則二者會(huì)連接在一起,對(duì)L中元素進(jìn)行的刪除操作會(huì)等同地發(fā)生在L2中,故不能僅僅利用L2來(lái)修正L。L3作為L(zhǎng)2的深拷貝,需要在函數(shù)執(zhí)行的最后進(jìn)行操作,故這之前需要將L2還原。本文利用L3對(duì)L進(jìn)行修正,當(dāng)?shù)谝淮蜭2和L不相同時(shí),L2中存放了完整的元素,L3為空,用L3深拷貝L2,然后賦值給L;當(dāng)之后L2和L不相同時(shí),L3中存放了開始時(shí)完整的數(shù)據(jù),故用L3來(lái)修正L,并且將L2進(jìn)行修正(對(duì)L進(jìn)行深拷貝)為了保證L3不變。然后修改num2中顯示的值為0即可。

????代碼如下:

? ? def restart():
? ?????global L,L2,L3,age
? ?????if((L2!=L)&(L3!=[])):
? ? ? ?????L=L3
? ? ? ?????L2=copy.deepcopy(L)
? ?????if((L2!=L)&(L3==[])):
? ? ? ?????L3=copy.deepcopy(L2)
? ? ? ?????L=L3
? ?????L3=copy.deepcopy(L2)
? ?????age = 0
? ?????num2.set("已抽取個(gè)數(shù):" + str(age))
? ?????num.set("目前還未抽取")

????按鈕設(shè)計(jì)與上述類似,直接放代碼:

????button2=tk.Button(root,text="重新抽取",font=("Microsoft ????????????SimHei",28),command=lambda:restart())
????button2.place(x=135,y=315)

至此小程序設(shè)計(jì)完畢。


?????4.源碼、效果圖和參考網(wǎng)址

源碼:

import tkinter as tk#導(dǎo)入庫(kù)
import random
from PIL import ImageTk,Image
from tkinter import filedialog
import copy
import pygame as py
age=0
#初始化對(duì)象
root=tk.Tk()#初始化一個(gè)窗口實(shí)例,名字為root
root.title("隨機(jī)抽取")#添加標(biāo)題文字
root.geometry('600x600')#設(shè)置窗體大小
#導(dǎo)入背景圖片
img=Image.open(r"C:\Users\86157\Desktop\隨機(jī)單詞抽取\1.jpg")
img=img.resize((600,600))
photo = ImageTk.PhotoImage(img)
tk.Label(master=root,image=photo).grid(row=0, column=0)
#顯示抽取出來(lái)的界面
num = tk.StringVar()
num.set('目前還未抽取')
label = tk.Label(root, textvariable=num, font=("SimHei", 40))
label.place(x=50, y=120)
num2 = tk.StringVar()
num2.set("已抽取個(gè)數(shù):"+str(age))
label = tk.Label(root, textvariable=num2, font=("SimHei", 40))
label.place(x=50, y=30)
L,L2,L3=[],[],[]
def getfile():
? ?global L,L2,L3
? ?L,L2,L3=[],[],[]
? ?file_path=filedialog.askopenfilename()
? ?with open(file_path, encoding="utf-8") as file:
? ? ? ?while (1):
? ? ? ? ? ?result = file.readline()
? ? ? ? ? ?result1 = result.split("\n")[0]
? ? ? ? ? ?result2 = result1.split(".")[-1]
? ? ? ? ? ?if (result):
? ? ? ? ? ? ? ?L.append(result2)
? ? ? ? ? ?else:
? ? ? ? ? ? ? ?L2 = copy.deepcopy(L)
? ? ? ? ? ? ? ?break
def getcharacters(L):
? ?global age,num2
? ?length=len(L)#列表長(zhǎng)度
? ?if(length!=0):
? ? ? ?number = random.randint(0, length-1) ?# 所取得序號(hào)
? ? ? ?age=age+1
? ? ? ?num2.set("已抽取個(gè)數(shù):"+str(age))
? ? ? ?return L.pop(number)
? ?else:
? ? ? ?return "抽取完畢!"
def restart():
? ?global L,L2,L3,age
? ?if((L2!=L)&(L3!=[])):
? ? ? ?L=L3
? ? ? ?L2=copy.deepcopy(L)
? ?if((L2!=L)&(L3==[])):
? ? ? ?L3=copy.deepcopy(L2)
? ? ? ?L=L3
? ?L3=copy.deepcopy(L2)
? ?age = 0
? ?num2.set("已抽取個(gè)數(shù):" + str(age))
? ?num.set("目前還未抽取")
#導(dǎo)入音樂(lè)
flag=1
py.mixer.init()
py.mixer.music.load(r"C:\Users\86157\Desktop\隨機(jī)單詞抽取\音樂(lè).mp3")
py.mixer.music.play(-1, 0)
def stop_openmusic():
? ?global flag
? ?if(flag==1):
? ? ? ?py.mixer.music.stop()
? ? ? ?flag=0
? ?else:
? ? ? ?py.mixer.init()
? ? ? ?py.mixer.music.load(r"C:\Users\86157\Desktop\隨機(jī)單詞抽取\音樂(lè).mp3")
? ? ? ?py.mixer.music.play(-1, 0)
? ? ? ?flag=1
#設(shè)置按鈕
button=tk.Button(root,text="隨機(jī)抽取",font=("Microsoft SimHei",28),command=lambda:num.set(str(getcharacters(L))))
button.place(x=135,y=215)
button2=tk.Button(root,text="重新抽取",font=("Microsoft SimHei",28),command=lambda:restart())
button2.place(x=135,y=315)
button3=tk.Button(root,text="導(dǎo)入文件",font=("Microsoft SimHei",28),command=lambda:getfile())
button3.place(x=135,y=415)
button3=tk.Button(root,text="開關(guān)音樂(lè)",font=("Microsoft SimHei",28),command=lambda:stop_openmusic())
button3.place(x=135,y=515)
root.mainloop()

效果圖:

小程序效果圖


相關(guān)包的使用及處理問(wèn)題參考網(wǎng)站:

  1. (23條消息) Python-Tkinter圖形化界面設(shè)計(jì)(詳細(xì)教程 )_python tkinter圖形_王張飛的博客-CSDN博客

  2. (23條消息) Python之解決tkinter.PhotoImage不顯示圖片的問(wèn)題 Python3_tk.photoimage_蘇妲己點(diǎn)姜子牙的博客-CSDN博客

  3. (23條消息) pygame導(dǎo)入音頻_pygame輸入音頻_黑脈金的博客-CSDN博客

  4. MyFreeMP3 (liumingye.cn)(下載mp3)

  5. 拓展 用Python制作一個(gè)隨機(jī)點(diǎn)名的小程序_嗶哩嗶哩_bilibili

  6. (23條消息) tkinter導(dǎo)入文件_搖搖晃搖晃的博客-CSDN博客



利用PyCharm設(shè)計(jì)簡(jiǎn)單的不重復(fù)單詞抽取器的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
浪卡子县| 晋江市| 琼中| 利辛县| 桐城市| 安义县| 卢龙县| 剑河县| 汝城县| 吉隆县| 长寿区| 化德县| 黑水县| 南和县| 潼南县| 萨迦县| 新源县| 泸溪县| 横山县| 台东市| 柳江县| 衡南县| 石泉县| 冀州市| 安福县| 广元市| 衡阳县| 邛崃市| 平远县| 手游| 睢宁县| 普定县| 陆良县| 马尔康县| 团风县| 穆棱市| 沂源县| 大邑县| 嘉峪关市| 吉木乃县| 安福县|