Python制作一个简单的抽奖软件(二)
Python制作一個簡單的抽獎軟件(二)
認(rèn)識QT
因為都對 QT和tkinter都沒用過,之前簡單使用tkinter后發(fā)現(xiàn),界面調(diào)整不太好弄。然后度娘了之后,QT是強大GUI庫之一,很多人都推薦它。重新選擇QT進行嘗試。于是,就使用了PYQT5,是QT的python版本。
https://www.riverbankcomputing.com/software/pyqt/download5
使用到的基礎(chǔ)控件認(rèn)識
QApplication
每一個QT程序都需要一個QApplication的對象,所以這個是第一個需要定義的:
app = QApplication(sys.argv)其中sys.argv是傳入的入?yún)?#xff0c;當(dāng)然我沒有用的入?yún)ⅰ?/p>
QWidget窗體
在QT內(nèi),所以可以顯示的都是Qwidget的子類,所以需要定義一個對象。
Qwidget:
setWindowTitle
setWindowTitle 是設(shè)置窗口標(biāo)題的名字:
self.setWindowTitle("2019年年會")frameGeometry
frameGeometry 是坐標(biāo)管理,允許我們創(chuàng)建一個無形矩形并根據(jù)主窗口的寬高設(shè)置自身的寬度與高度。簡單理解就是獲取這個控件(QWidget)的幾何內(nèi)容(寬高位置等)
我們可以通過這個來對窗口打開時在屏幕的位置進行初始化:
QPalette()
QPalette 是QT的調(diào)色板,可以用個QPalette來進行背景圖的設(shè)置:
def init_mainwindow(self):self.main_p = QPalette()self.main_p.setBrush(self.backgroundRole(),QBrush(QPixmap("beijing2.jpg")))#self.main_p.setScaledContents(True)self.setPalette(self.main_p)也可以通過QPalette來對圖片進行處理:這里的處理是對圖片進行縮放,然后后面再刷圖的時候回使用到
def scale_image(self,filename):p_pal = QPalette()img = QImage(filename)size = QSize(self.prize.person_size[0], self.prize.person_size[1])p_pal.setBrush(self.backgroundRole(), QBrush(QPixmap.fromImage(img.scaled(size, Qt.IgnoreAspectRatio))))return p_palQLabel
QLabel對象作為一個占位符可以顯示不可編輯的文本或者圖片,也可以放一個gif動畫,還可以作為一個提示標(biāo)記作為其他控件,這個控件作用還是比較多的。
可以顯示一段文本:這里顯示了窗口里面的大小標(biāo)題
字體的樣式是可以進行設(shè)置的setFont,顏色也可以設(shè)置,move是需要放置的位置
當(dāng)然如果顯示一大段文本信息的話,可以設(shè)置換行setWordWrap,以及自適應(yīng)lable大小setScaledContents:
setWordWrap(True) setScaledContents(True)也可以顯示圖片,這里面setToolTip是顯示提示信息,setPalette設(shè)置具體的圖片,setAlignment在這個控件的位置,setAutoFillBackground,顯示圖片的時候需要設(shè)置
def create_lable_photo(self, file, name, i):label_ph = QLabel(self)label_ph.setToolTip(name)label_ph.setPalette(self.scale_image(file))label_ph.setAlignment(Qt.AlignCenter)label_ph.setScaledContents(True)label_ph.setAutoFillBackground(True)label_ph.setFont(self.btn_font)label_ph.resize(self.prize.person_size[0],self.prize.person_size[1])place = self.prize.show_place[i]label_ph.move(place[0], place[1])return label_phQPushButton
QPushButton 是按鍵控件,可以提供一個點擊的按鈕來觸發(fā)摸一個事件,按鍵可以顯示文字,也可以顯示圖片:
def init_button(self):self.start_btn = QPushButton("PyQt5 Button", self)self.start_btn.setText("長按開始第" + str(self.now_scroll_number + 1) + "個")self.start_btn.setAutoRepeatDelay(0.01) // 設(shè)置自動長按觸發(fā)的時間間隔self.start_btn.setAutoRepeat(True) // 打開長按自動重復(fù)#self.start_btn.clicked.connect(self.btn_start) // 點擊觸發(fā)事件self.start_btn.pressed.connect(self.btn_start_once) // 按下觸發(fā)事件self.start_btn.released.connect(self.btn_hit_once) //釋放按鍵觸發(fā)事件self.start_btn.setStyleSheet(self.btn_sty) //按鍵的相關(guān)樣式self.start_btn.setFont(self.btn_font) //文字樣式QHBoxLayout
QBoxLayout可以在水平方向或垂直方向上排列控件,由QHBoxLayout、QVBoxLayout所繼承
我這里是有QBoxLayout對三個按鍵的布局進行了控制:
上下左右設(shè)置:AlignLeft 、AlignRight 、AlignCenter ,AlignBottom
QMessageBox
QMessageBox是消息彈窗口
其中 提示信息的彈窗:
其中 彈出詢問選擇的窗口:
res = QMessageBox.question(self, "抽獎完畢", "請確認(rèn)是否認(rèn)同此次抽獎", QMessageBox.Yes | QMessageBox.No)if res== QMessageBox.Yes:至此,QT5在本程序中使用到的相關(guān)基本控件就介紹完了。當(dāng)然,還有音樂播放器和焦點變更沒有提及,我也已經(jīng)加了,因為家里的程序沒有加上,所以這里就不介紹了。
抽獎程序中一些關(guān)鍵邏輯
OS
這部分是初始化參與抽獎的人,我這邊將以人民命名的照片放到一個文件夾下面,這樣初始化時,自動從文件夾下面讀取,用的的是OS模塊
def find_photo(self, path):self.photos = {}for file in os.listdir(path):print(file)file_path = os.path.join(path, file)if os.path.isfile(file_path):self.photos[self.filter_name(file)] = file_path中文編碼
相信很多人會遇到中文亂碼的事情,
我這里是一開始使用的是 GB2312解碼, 但是后面發(fā)現(xiàn)有一些中文GB2312,也不認(rèn)識,后面又換成了GB18030
GBK支持簡體中文和繁體中文
GB2312只支持簡體中文,GBK里面包含了GB2312,用GBK比較多
GB18030是32位的,它支持簡體中文、繁體中文 藏文、蒙文、維吾爾文等主要的少數(shù)民族文字
random
對于抽獎軟件,大家肯定都是要關(guān)心隨機抽取,我這里直接使用的是random模塊:
random.shuffle(we_need_list)這里面使用到的是 經(jīng)典的洗牌算法 Knuth-Durstenfeld Shuffle,雖然仍然是偽隨機,但是已經(jīng)足夠我們的場景了。關(guān)于真隨機,主要是隨機數(shù)種子的獲取,就不復(fù)述了。
重復(fù)抽取
有時候會需要對已經(jīng)抽獎的人進行去除,或者重新加入抽獎:
去除:主要是對參加抽獎的人的list中去掉對應(yīng)的抽獎人使用的 list.remove
重新加入: 這里我主要是維護了另一個新的表,在初始化的時候,會對list進行深拷貝:
使用到的copy模塊:
顯示的中獎人圖片位置
一開始我并沒有使用QT自己的布局控件,是自己利用獲取到的屏幕size,然后進行坐標(biāo)換算,從而實現(xiàn)的自適應(yīng)調(diào)整:
def calc_show_place(self, calc_list, line):place_all = []name_all = []number = len(calc_list)x_zone_sigle = (config.show_x_zone * self.window_size[0]) / numbernew_start = config.show_x_place_start * self.window_size[0]photo_new = self.person_size[0] / 2for i in range(number):center_place = new_start + (x_zone_sigle / 2)new_place = [(center_place - photo_new), config.show_y_place_start[line] * self.window_size[1]]place_all.append(new_place)y_name_zone = config.show_name_place * self.window_size[1]name_place = [(center_place - (config.name_size[0] /2)) , (y_name_zone + new_place[1] + self.person_size[1])]name_all.append(name_place)new_start += x_zone_siglereturn place_all, name_all最后再貼一次我的最終效果圖:
后續(xù)有時間,再對這個程序進行優(yōu)化,完善。
非常高興有朋友咨詢
更新一下 源碼的 github 地址,如果有問題,歡迎指正
https://github.com/jopinzhangji/lottery_draw
參考
https://blog.csdn.net/jhj_666/article/details/77940872
https://blog.csdn.net/liang19890820/article/details/51537246
https://www.cnblogs.com/shokey520/p/3806628.html
其實還有很多,忘記了。。。
總結(jié)
以上是生活随笔為你收集整理的Python制作一个简单的抽奖软件(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于myecilpse软件制作的欢乐摇奖
- 下一篇: 缓和曲线段长度的计算分析