1. 程式人生 > >教你用Python寫介面

教你用Python寫介面

好程式碼本身就是最好的文件。當你需要新增一個註釋時,你應該考慮如何修改程式碼才能不需要註釋

作為Pyhon開發者,你遲早都會碰到圖形使用者介面(GUI)應用開發任務,這時候我們就需要一些介面庫來幫助我們快速搭建介面,python的介面庫很多,我認識的並不多,這裡只列出幾種我認識的

1.tkinter

Tkinter(也叫Tk介面)是Tk圖形使用者介面工具包標準的Python介面。Tk是一個輕量級的跨平臺圖形使用者介面(GUI)開發工具。Tk和Tkinter可以執行在大多數的Unix平臺、Windows、和Macintosh系統。

Tkinter 由一定數量的模組組成。Tkinter位於一個名為_tkinter(較早的版本名為tkinter)的二進位制模組中 。Tkinter包含了對Tk的低 級介面模組,低階介面並不會被應用級程式設計師直接使用,通常是一個共享庫(或DLL),但是在一些情況下它也被Python直譯器靜態連結。

2.pyqt

PyQt是Qt庫的Python版本。PyQt3支援Qt1到Qt3。 PyQt4支援Qt4。它的首次釋出也是在1998年,但是當時它叫 PyKDE,因為開始的時候SIP和PyQt沒有分開。PyQt是用SIP寫的。PyQt 提供 GPL版和商業版。

3.wxpython

wxPython 是 Python 語言的一套優秀的 GUI 圖形庫,允許 Python 程式設計師很方便的建立完整的、功能鍵全的 GUI 使用者介面。 wxPython 是作為優秀的跨平臺 GUI 庫 wxWidgets 的 Python 封裝和 Python 模組的方式提供給使用者的。

就如同Python和wxWidgets一樣,wxPython也是一款開源軟體,並且具有非常優秀的跨平臺能力,能夠執行在32位windows、絕大多數的Unix或類Unix系統、Macintosh OS X上。

4.Kivy

這是一個非常有趣的專案,基於OpenGL ES 2,支援Android和iOS平臺的原生多點觸控,作為事件驅動的框架,Kivy非常適合遊戲開發,非常適合處理從widgets到動畫的任務。如果你想開發跨平臺的圖形應用,或者僅僅是需要一個強大的跨平臺圖形使用者開發框架,Kivy都是不錯的選擇。
5.pygame

Pygame是跨平臺Python模組,專為電子遊戲設計,包含影象、聲音。建立在SDL基礎上,允許實時電子遊戲研發而無需被低階語言(如機器語言組合語言)束縛。

這個庫使用來寫遊戲的,但是你也可以用來寫介面,嘿嘿

那選擇什麼庫是個人的喜好,但是我推薦儘可能去選擇一種通過且學習資料比較多的吧,我這裡選擇的是tkinter,專案要求比較急,沒怎麼挑就選了。。。。

我學習也不是很深,如果你想要進行更深的學習請前往tkinter官方文件

先來看看Tkinter裡面的基礎控制元件

接下來的程式碼講解中你需要匯入這些

from tkinter import *
from tkinter.tix import Tk, Control, ComboBox  #升級的組合控制元件包
from tkinter.messagebox import showinfo, showwarning, showerror #各種型別的提示框

在進行介面繪製之前你需要初始化Tk()

root = Tk() # 初始化Tk()

root便是你佈局的根節點了,以後的佈局都在它之上

root.title("hello tkinter")    # 設定視窗標題
root.geometry("800x1000")    # 設定視窗大小 注意:是x 不是*
root.resizable(width=True, height=True) # 設定視窗是否可以變化長/寬,False不可變,True可變,預設為True
root.tk.eval('package require Tix')  #引入升級包,這樣才能使用升級的組合控制元件

設定一些視窗屬性

1.Label

再來看看Label,它的屬性很多

activebackground, activeforeground, anchor,
background, bitmap, borderwidth, cursor,
disabledforeground, font, foreground,
highlightbackground, highlightcolor,
highlightthickness, image, justify,
padx, pady, relief, takefocus, text,
textvariable, underline, wraplength
height, state, width

太多了,作用基本和名字一樣,這裡就不一一說了,你可以自己去試試,我說一下常用的屬性

lable = Label(root, text="label", bg="pink",bd=10, font=("Arial",12), width=8, height=3)
lable.pack(side=LEFT)
第一個 要依附的節點
text 上面顯示的字
bg 背景顏色  也可以傳rgb16進位制的形式
bd 邊框寬度
font 字型 第一個是字型樣式 第二個是字型大小
width  height 寬 高
bitmap 影象
highlightcolor 高亮時字型顏色
highlightbackground 高亮時背景顏色
textvariable 繫結的變數 之後如果變數值發生變動 字也會隨之改變
wraplength 換行控制 如果是50就表示寬度到50就換行顯示

最後你需要呼叫pack()來把控制元件佈置上去,你可以指定佈局方式,可定義的屬性也非常多

# Booleans
NO=FALSE=OFF=0
YES=TRUE=ON=1

# -anchor and -sticky
N='n'
S='s'
W='w'
E='e'
NW='nw'
SW='sw'
NE='ne'
SE='se'
NS='ns'
EW='ew'
NSEW='nsew'
CENTER='center'

# -fill
NONE='none'
X='x'
Y='y'
BOTH='both'

# -side
LEFT='left'
TOP='top'
RIGHT='right'
BOTTOM='bottom'

# -relief
RAISED='raised'
SUNKEN='sunken'
FLAT='flat'
RIDGE='ridge'
GROOVE='groove'
SOLID = 'solid'

# -orient
HORIZONTAL='horizontal'
VERTICAL='vertical'

# -tabs
NUMERIC='numeric'

# -wrap
CHAR='char'
WORD='word'

# -align
BASELINE='baseline'

# -bordermode
INSIDE='inside'
OUTSIDE='outside'

# Special tags, marks and insert positions
SEL='sel'
SEL_FIRST='sel.first'
SEL_LAST='sel.last'
END='end'
INSERT='insert'
CURRENT='current'
ANCHOR='anchor'
ALL='all' # e.g. Canvas.delete(ALL)

# Text widget and button states
NORMAL='normal'
DISABLED='disabled'
ACTIVE='active'
# Canvas state
HIDDEN='hidden'

# Menu item types
CASCADE='cascade'
CHECKBUTTON='checkbutton'
COMMAND='command'
RADIOBUTTON='radiobutton'
SEPARATOR='separator'

# Selection modes for list boxes
SINGLE='single'
BROWSE='browse'
MULTIPLE='multiple'
EXTENDED='extended'

# Activestyle for list boxes
# NONE='none' is also valid
DOTBOX='dotbox'
UNDERLINE='underline'

# Various canvas styles
PIESLICE='pieslice'
CHORD='chord'
ARC='arc'
FIRST='first'
LAST='last'
BUTT='butt'
PROJECTING='projecting'
ROUND='round'
BEVEL='bevel'
MITER='miter'

# Arguments to xview/yview
MOVETO='moveto'
SCROLL='scroll'
UNITS='units'
PAGES='pages'

寫完這些你執行程式發現還是無法出現介面,那是因為你還少了一句

root.mainloop()

加上這句話使程式進入訊息迴圈,介面便會顯示出來

學完了label之後學其他控制元件也就簡單了很多,因為很多屬性都是相同的

2.Button

button=Button(root,text='QUIT',command=root.quit,activeforeground="black",activebackground='blue',bg='red',fg='white')
button.pack(fill=Y,expand=1)

之前說過的屬性如果沒有特殊情況就不再說了

command 點選呼叫的方法
activeforeground 點選時按鈕上字的顏色
activebackground 點選時按鈕的背景顏色

3.Scale

def resize(ev=None):
    lable.config(font='Helvetica -%d bold'%scale.get())
scale=Scale(root,from_=10,to=40,orient=HORIZONTAL,command=resize)
scale.set(12)
scale.pack()

和button不同的是command不再是點選事件了而是拖動事件 ,呼叫set()方法可以設定當前位置

from_ 滑動條起始值
to 滑動條終點值
origent 樣式 兩種樣式 一橫一豎

4.NumbericUpDown

ct=Control(root,label='Number:',integer=True,max=12,min=2,value=2,step=2)
ct.label.config(font='Helvetica 14 bold')
ct.pack()
integer 是否為整數
max 最大值
min 最小值
value 初始值
step 步長

這是一個數字選擇框 其中的字型配置需要使用config()方法來進行配置

5.ComboBox

cb=ComboBox(root,label='Type:',editable=True)
for animal in ('dog','cat','hamster','python'):
    cb.insert(END,animal)
cb.pack()

這是一個下拉選擇框,label前面要顯示的字,editable控制是否可更改

呼叫insert()給下拉選擇框新增選項

6.Menu

def click():
    print("點選了一次")
menubar=Menu(root)
root.config(menu=menubar)
filemenu=Menu(menubar,tearoff=0)
menubar.add_cascade(label='檔案',menu=filemenu)
filemenu.add_command(label='新建...',command=click())
filemenu.add_command(label='開啟...',command=click())
filemenu.add_command(label='儲存',command=click())
filemenu.add_command(label='關閉填寫',command=root.quit)

慘淡藍需要所依附的節點配置menu才能起作用

呼叫add_cascade給menu新增一項選項

帶哦用add_command則是給外層的選項新增一個子選項

7.Frame

frame1 =Frame(root)
frame1.pack(fill=X)
lable1=Label(frame1,text='您的花名:  ')
lable1.grid(row=1,column=0)

frame相當於一個區域性的窗體,可以用來裝載其它控制元件

使用grid能讓你更容易把握控制元件的位置,你可以指定它出現在幾行幾列,是否跨行跨列,跨幾行等等

8.Radiobutton

frame2=Frame(root)
frame2.pack(fill=X)
lable2=Label(frame2,text='您的性別:  ')
lable2.grid(row=1,column=0)
sex=StringVar()
sex_male=Radiobutton(frame2,text='男',fg='blue',variable=sex,value='男')
sex_male.grid(row=1,column=2)
sex_female=Radiobutton(frame2,text='女',fg='red',variable=sex,value='女')
sex_female.grid(row=1,column=4)

這是一個單選框,裡面的屬性之前也說過

9.ListBox

frame4 =Frame(root)
frame4.pack(fill=X)
lable4=Label(frame4,text='4、請刪除您不會的變成語言:  ')
lable4.grid(row=1,column=0)
listbox=Listbox(frame4)
listbox.grid(row=1,column=1)
for item in ["C","C++","JAVA","PYTHON","R","SQL","JS"]:
    listbox.insert(END,item)
DELETE=Button(frame4,text="刪除",command=lambda listbox=listbox:listbox.delete(ANCHOR))
DELETE.grid(row=1,column=2)
language=Button(frame4,text="確定")
language.grid(row=2,column=1)

這是一個列表,注意這裡按鈕點選事件的寫法是用lambda表示式寫的

10.Canvas

canvas = Canvas(window, width = 200, height = 100, bg = "White")
canvas.pack()

這是一個畫板,你可以在上面畫各種形狀,上例子:

from tkinter import *

class CanvasDemo:
    def __init__(self):
        window = Tk()
        window.title("CanvasDemo")

        self.canvas = Canvas(window, width = 200, height = 100, bg = "White")
        self.canvas.pack()

        frame = Frame(window)
        frame.pack()

        btRectangle = Button(frame, text = "長方形", command = self.displayRect)
        btOval = Button(frame, text="橢 圓", command=self.displayOval)
        btArc = Button(frame, text = "圓 弧", command = self.displayArc)
        btPolygon = Button(frame, text="多邊形", command=self.displayPolygon)
        btLine = Button(frame, text=" 線 ", command=self.displayLine)
        btString = Button(frame, text="文 字", command=self.displayString)
        btClear = Button(frame, text="清 空", command=self.clearCanvas)

        btRectangle.grid(row = 1, column = 1)
        btOval.grid(row=1, column=2)
        btArc.grid(row=1, column=3)
        btPolygon.grid(row=1, column=4)
        btLine.grid(row=1, column=5)
        btString.grid(row=1, column=6)
        btClear.grid(row=1, column=7)

        window.mainloop()

    def displayRect(self):
        self.canvas.create_rectangle(10, 10, 190, 90, tags = "rect")
    def displayOval(self):
        self.canvas.create_oval(10, 10, 190, 90, tags = "oval", fill = "red")
    def displayArc(self):
        self.canvas.create_arc(10, 10, 190, 90, start = -90, extent = 90, width = 5, fill = "red", tags = "arc")
    def displayPolygon(self):
        self.canvas.create_polygon(10, 10, 190, 90, 30, 50, tags = "polygon")
    def displayLine(self):
        self.canvas.create_line(10, 10, 190, 90, fill = 'red', tags = "line")
        self.canvas.create_line(10, 90, 190, 10, width = 9, arrow = "last", activefill = "blue", tags = "line")
    def displayString(self):
        self.canvas.create_text(60, 40, text = "Hi,i am a string", font = "Tine 10 bold underline", tags = "string")
    def clearCanvas(self):
        self.canvas.delete("rect", "oval", "arc", "polygon", "line", "string")

CanvasDemo()

 11.CheckButton

frame8=Frame(root)
frame8.pack()
agree=StringVar()
agree=Checkbutton(frame8,text='我同意',variable=agree,onvalue='確定',offvalue="不確定",)
agree.grid()

這是一個多選框,oncalue代表被勾選時的值,offvalue代表不被勾選時的值

12.LabelFrame

frame10=Frame(root)
frame10.pack()
group=LabelFrame(frame10,text='特別鳴謝',padx=5,pady=5)
group.grid()
w=Label(group,text='容器框')
w.pack()

這是個容器框,padx,pady分別控制在x,y方向上的外邊距

差不多這些控制元件已經夠用了,我這還有幾個小例子供你練習