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()