1.Tkinter GUI圖形介面
一、視窗的主體框架(window)
from tkinter import *
import tkinter as tk
window = tk.Tk()
window.title('my window')
window.geometry('200x100')
window.mainloop()
二、加上標籤(Label)
因為Python 是直譯式語言,所以我可以把下列程式碼安插在window.geometry('200x100') 與 window.mainloop()之間
l = tk.Label(window,text='Hello World!', bg='green', font=('Arial', 12), width=15, height=2 )
l.pack()
三、加上按鈕與互動式功能(Button)
(一)單一按鈕、單一對話窗
from tkinter import *
import tkinter as tk
window = tk.Tk()
window.title('my window')
window.geometry('200x100')
var = tk.StringVar()
l = tk.Label(window,textvariable=var, bg='green', font=('Arial', 12), width=15, height=2 ).pack()
on_hit1 = False
def hit_me():
global on_hit1
if on_hit1 == False:
on_hit1 = True
var.set('press the button')
else:
on_hit1 = False
var.set(' cancel the button')
b = tk.Button(window,text='hit me', width=15, height=2,command=hit_me).pack()
window.mainloop()
1. 初始畫面 2. 第一次壓按鈕 3. 第二次壓按鈕
(二)如果未來要增加按鈕與對話視窗,可以這樣做
1. var1 = tk.StringVar()
2. l 變成l1
3. b變成b1
4. 全域變數on_hit1 可以多設置 on_hit2
大略上可分為兩種表示法:
from tkinter import *
import tkinter as tk
window = tk.Tk()
window.title('my window')
window.geometry('200x200')
var1 = tk.StringVar()
l1 = tk.Label(window,textvariable=var1, bg='green', font=('Arial', 12), width=15, height=2 ).pack()
on_hit1 = False
def hit_me1():
global on_hit1
if on_hit1 == False:
on_hit1 = True
var1.set('press the button')
else:
on_hit1 = False
var1.set(' cancel the button')
b1 = tk.Button(window,text='hit me', width=15, height=2, command=hit_me1) .pack()
#####################################
var2 = tk.StringVar()
l2 = tk.Label(window,textvariable=var2, bg='green', font=('Arial', 12),width=15, height=2 ).pack()
on_hit2 = False
def hit_me2():
global on_hit2
if on_hit2 == False:
on_hit2 = True
var2.set('press the button')
else:
on_hit2 = False
var2.set(' cancel the button')
b2 = tk.Button(window,text='hit me', width=15, height=2, command=hit_me2) .pack()
window.mainloop()
這種敘述法是這樣的排列
from tkinter import *
import tkinter as tk
window = tk.Tk()
window.title('my window')
window.geometry('200x200')
var1 = tk.StringVar()
var2 = tk.StringVar()
on_hit1 = False
on_hit2 = False
l1 = tk.Label(window,textvariable=var1, bg='green', font=('Arial', 12), width=15, height=2 ).pack()
l2 = tk.Label(window,textvariable=var2, bg='green', font=('Arial', 12), width=15, height=2 ).pack()
def hit_me1():
global on_hit1
if on_hit1 == False:
on_hit1 = True
var1.set('press the button')
else:
on_hit1 = False
var1.set(' cancel the button')
b1 = tk.Button(window,text='hit me', width=15, height=2, command=hit_me1) .pack()
def hit_me2():
global on_hit2
if on_hit2 == False:
on_hit2 = True
var2.set('press the button')
else:
on_hit2 = False
var2.set(' cancel the button')
b2 = tk.Button(window,text='hit me', width=15, height=2, command=hit_me2).pack()
window.mainloop()
這種敘述法是這樣的排列
使用類別來處理tkinter的按鈕
from tkinter import *
class ProcessButtonEvent:
def __init__(self):
window = Tk()
btOK =Button(window, text="OK", fg ="red", command = self.processOK )
btCancel =Button(window, text="Cancel", fg ="blue", command = self.processCancel )
btOK.pack()
btCancel.pack()
window.mainloop()
def processOK(Self):
print("OK button is clicked")
def processCancel(Self):
print("Cancel button is clicked")
ProcessButtonEvent()
四、輸入欄位(Entry)與文字顯示框(Text)
除了一開始需要引用視窗之外,需要引用輸入欄位e = tk.Entry(window, show = None )
其中,show 可以輸入 None (按照輸入的字面顯示) 或 " * " (類似輸入密碼一樣顯示星號)
當然,輸入欄位可能不只一個,因此:
e = tk.Entry(window, show=None)
e.pack()
可以把它改寫成
e1 = tk.Entry(window, show=None)
e1.pack()
而,啟用button按鈕功能前需要先定義狀態,且:
t = tk.Text(window, height=2)
t.pack()
放在程式碼的下方表示,文字顯示框會出現在視窗的下部
import tkinter as tk
window = tk.Tk()
window.title('my window')
window.geometry('200x200')
# e = tk.Entry(window, show="*")
e = tk.Entry(window, show=None).pack()
def insert_point():
var = e.get()
t.insert('insert', var)
def insert_end():
var = e.get()
t.insert('end', var)
b1 = tk.Button(window, text='insert point', width=15,height=2, command=insert_point).pack()
b2 = tk.Button(window, text='insert end', command=insert_end).pack()
t = tk.Text(window, height=2).pack()
window.mainloop()
五、下拉式選單(Listbox)
紅色字體var2,則為選項
import tkinter as tk
window = tk.Tk()
window.title('my window')
window.geometry('200x200')
var1 = tk.StringVar()
var2 = tk.StringVar()
var2.set((11,22,33,44))
def print_selection():
value = lb.get(lb.curselection())
var1.set(value)
l = tk.Label(window, bg='yellow', width=4, textvariable=var1).pack()
b1 = tk.Button(window, text='print selection', width=15,height=2, command=print_selection).pack()
lb = tk.Listbox(window, listvariable=var2).pack()
window.mainloop()
若要安插其他的選項,可以考慮如下語法:
list_items = [1,2,3,4]
for item in list_items:
lb.insert('end', item)
lb.insert(1, 'first')
lb.insert(2, 'second')
lb.delete(2)
六、單選按鈕(Radio Button)
import tkinter as tk
window = tk.Tk()
window.title('my window')
window.geometry('200x200')
var = tk.StringVar()
l = tk.Label(window, bg='yellow', width=20, text='empty').pack()
def print_selection():
l.config(text='you have selected ' + var.get())
r1 = tk.Radiobutton(window, text='Option A',variable=var, value='A',command=print_selection).pack()
r2 = tk.Radiobutton(window, text='Option B',variable=var, value='B',command=print_selection).pack()
r3 = tk.Radiobutton(window, text='Option C',variable=var, value='C',command=print_selection).pack()
window.mainloop()
七、拉桿滑塊(Scale)
import Tkinter as tk
window = tk.Tk()
window.title('my window')
window.geometry('200x200')
l = tk.Label(window, bg='yellow', width=20, text='0')
l.pack()
def print_selection(v):
l.config(text='you have selected ' + v)
s = tk.Scale(window, label='try me', from_=5, to=11, orient=tk.HORIZONTAL,length=200, showvalue=0, tickinterval=2, resolution=0.01, command=print_selection)
s.pack()
window.mainloop()
八、複選核取方塊
import Tkinter as tk
window = tk.Tk()
window.title('my window')
window.geometry('200x200')
l = tk.Label(window, bg='yellow', width=20, text='empty')
l.pack()
def print_selection():
if (var1.get() == 1) & (var2.get() == 0):
l.config(text='I love only Python ')
elif (var1.get() == 0) & (var2.get() == 1):
l.config(text='I love only C++')
elif (var1.get() == 0) & (var2.get() == 0):
l.config(text='I do not love either')
else:
l.config(text='I love both')
var1 = tk.IntVar()
var2 = tk.IntVar()
c1 = tk.Checkbutton(window, text='Python', variable=var1, onvalue=1, offvalue=0,
command=print_selection)
c2 = tk.Checkbutton(window, text='C++', variable=var2, onvalue=1, offvalue=0,
command=print_selection)
c1.pack()
c2.pack()
window.mainloop()
九、畫布 (Canvas)
import Tkinter as tk
window = tk.Tk()
window.title('my window')
window.geometry('200x200')
canvas = tk.Canvas(window, bg='blue', height=100, width=200)
image_file = tk.PhotoImage(file='ins.gif')
image = canvas.create_image(10, 10, anchor='nw', image=image_file)
x0, y0, x1, y1= 50, 50, 80, 80
line = canvas.create_line(x0, y0, x1, y1)
oval = canvas.create_oval(x0, y0, x1, y1, fill='red')
arc = canvas.create_arc(x0+30, y0+30, x1+30, y1+30, start=0, extent=180)
rect = canvas.create_rectangle(100, 30, 100+20, 30+20)
canvas.pack()
def moveit():
canvas.move(rect, 0, 2)
b = tk.Button(window, text='move', command=moveit).pack()
window.mainloop()
圖片下載 ins.gif
十、選單(Menu)
import Tkinter as tk
window = tk.Tk()
window.title('my window')
window.geometry('200x200')
l = tk.Label(window, text='', bg='yellow')
l.pack()
counter = 0
def do_job():
global counter
l.config(text='do '+ str(counter))
counter+=1
menubar = tk.Menu(window)
filemenu = tk.Menu(menubar, tearoff=0)
menubar.add_cascade(label='File', menu=filemenu)
filemenu.add_command(label='New', command=do_job)
filemenu.add_command(label='Open', command=do_job)
filemenu.add_command(label='Save', command=do_job)
filemenu.add_separator()
filemenu.add_command(label='Exit', command=window.quit)
editmenu = tk.Menu(menubar, tearoff=0)
menubar.add_cascade(label='Edit', menu=editmenu)
editmenu.add_command(label='Cut', command=do_job)
editmenu.add_command(label='Copy', command=do_job)
editmenu.add_command(label='Paste', command=do_job)
submenu = tk.Menu(filemenu)
filemenu.add_cascade(label='Import', menu=submenu, underline=0)
submenu.add_command(label="Submenu1", command=do_job)
window.config(menu=menubar)
window.mainloop()
十一、框架(Frame)
import Tkinter as tk
window = tk.Tk()
window.title('my window')
window.geometry('200x200')
tk.Label(window, text='on the window').pack()
frm = tk.Frame(window)
frm.pack()
frm_l = tk.Frame(frm, )
frm_r = tk.Frame(frm)
frm_l.pack(side='left')
frm_r.pack(side='right')
tk.Label(frm_l, text='on the frm_l1').pack()
tk.Label(frm_l, text='on the frm_l2').pack()
tk.Label(frm_r, text='on the frm_r1').pack()
window.mainloop()
十二、彈出式視窗(Message Box)
import Tkinter as tk
import tkinter.messagebox
window = tk.Tk()
window.title('my window')
window.geometry('200x200')
def hit_me():
#tk.messagebox.showinfo(title='Hi', message='hahahaha') # return 'ok'
#tk.messagebox.showwarning(title='Hi', message='nononono') # return 'ok'
#tk.messagebox.showerror(title='Hi', message='No!! never') # return 'ok'
#print(tk.messagebox.askquestion(title='Hi', message='hahahaha')) # return 'yes' , 'no'
#print(tk.messagebox.askyesno(title='Hi', message='hahahaha')) # return True, False
print(tk.messagebox.asktrycancel(title='Hi', message='hahahaha')) # return True, False
print(tk.messagebox.askokcancel(title='Hi', message='hahahaha')) # return True, False
print(tk.messagebox.askyesnocancel(title="Hi", message="haha")) # return, True, False, None
tk.Button(window, text='hit me', command=hit_me).pack()
window.mainloop()
十三、放置位置
import Tkinter as tk
window = tk.Tk()
window.geometry('200x200')
#canvas = tk.Canvas(window, height=150, width=500)
#canvas.grid(row=1, column=1)
#image_file = tk.PhotoImage(file='welcome.gif')
#image = canvas.create_image(0, 0, anchor='nw', image=image_file)
#tk.Label(window, text='1').pack(side='top')
#tk.Label(window, text='1').pack(side='bottom')
#tk.Label(window, text='1').pack(side='left')
#tk.Label(window, text='1').pack(side='right')
#for i in range(4):
#for j in range(3):
#tk.Label(window, text=1).grid(row=i, column=j, padx=10, pady=10)
tk.Label(window, text=1).place(x=20, y=10, anchor='nw')
window.mainloop()