Python GUI之tkinter詳解
展示
import tkinter if __name__ == '__main__': win = tkinter.Tk() #設置標題 win.title("我的世界") #設置寬和高 win.geometry('800x600') #創建畫佈,設置背景色,高,寬 canvas = tkinter.Canvas(win,bg='#EBEBEB',width=800,height=1200,xscrollincrement = 1, yscrollincrement = 1) x0,y0 = 100,100 # 創建一個圓,填充紅色,輪廓白色 oval = canvas.create_oval(x0-5,y0-5,x0+5,y0+5,fill='#ff0000',outline="#000000",tags="node") canvas.create_text(x0,y0-10,text='('+str(x0) +','+str(y0)+')',fill='black',tags="text") p1 = (x0,y0) x0, y0 = 120,170 oval = canvas.create_oval(x0 - 5, y0 - 5, x0 + 5, y0 + 5, fill='#ff0000', outline="#000000", tags="node") canvas.create_text(x0, y0 - 10, text='(' + str(x0) + ',' + str(y0) + ')', fill='black',tags="text") p2 = (x0, y0) #連線 canvas.create_line(p1, p2, fill='#000000', tags="line") canvas.pack(expand = tkinter.YES, fill = tkinter.BOTH) #刪除tags = "text" # canvas.delete("text") win.mainloop()
from tkinter import * import random if __name__ == '__main__': win = Tk() #設置標題 win.title("我的世界") #設置寬和高 win.geometry('800x600') frame = Frame(win) #創建畫佈,設置背景色,高,寬 canvas = Canvas(frame,bg='#EBEBEB',width=800,height=800,scrollregion=(0,0,2000,1200)) pos = [[565.0,575.0],[25.0,185.0],[345.0,750.0],[945.0,685.0],[845.0,655.0], [880.0,660.0],[25.0,230.0],[525.0,1000.0],[580.0,1175.0],[650.0,1130.0], [1605.0,620.0],[1220.0,580.0],[1465.0,200.0],[1530.0, 5.0],[845.0,680.0], [725.0,370.0],[145.0,665.0],[415.0,635.0],[510.0,875.0],[560.0,365.0], [300.0,465.0],[520.0,585.0],[480.0,415.0],[835.0,625.0],[975.0,580.0], [1215.0,245.0],[1320.0,315.0],[1250.0,400.0],[660.0,180.0],[410.0,250.0], [420.0,555.0],[575.0,665.0],[1150.0,1160.0],[700.0,580.0],[685.0,595.0], [685.0,610.0],[770.0,610.0],[795.0,645.0],[720.0,635.0],[760.0,650.0], [475.0,960.0],[95.0,260.0],[875.0,920.0],[700.0,500.0],[555.0,815.0], [830.0,485.0],[1170.0, 65.0],[830.0,610.0],[605.0,625.0],[595.0,360.0], [1340.0,725.0],[1740.0,245.0]] for x,y in pos: canvas.create_oval(x - 5, y - 5, x + 5, y + 5, fill='#ff0000', outline="#000000", tags="node") canvas.create_text(x, y - 10, text='(' + str(x) + ',' + str(y) + ')', fill='black', tags="text") length = len(pos) path = [x for x in range(length)] random.shuffle(path) for i in range(length-1): canvas.create_line(pos[i], pos[i+1], fill='#000000', tags="line") hbar = Scrollbar(frame,orient=HORIZONTAL) # 定義水平滾動條 hbar.pack(side=BOTTOM, fill=X) # 放置水平滾動條在最下側,占滿X軸 hbar.config(command=canvas.xview)# 設置水平滾動條的函數與畫佈的X軸滾動條事件綁定 vbar = Scrollbar(frame,orient=VERTICAL) # 定義垂直滾動條 vbar.pack(side=RIGHT, fill=Y) # 放置垂直滾動條在最右側,占滿Y軸 vbar.config(command=canvas.yview)# 設置垂直滾動條的函數與畫佈的Y軸滾動條事件綁定 canvas.config(xscrollcommand=hbar.set, yscrollcommand=vbar.set) # 設置畫佈的X,Y軸滾動條函數與垂直滾動條綁定 canvas.pack(expand=True, fill=BOTH) frame.pack(expand=True, fill=BOTH) #刪除tags = "text" # canvas.delete("text") win.mainloop()
多線程
import time from tkinter import * import random import threading pos = [[565.0,575.0],[25.0,185.0],[345.0,750.0],[945.0,685.0],[845.0,655.0], [880.0,660.0],[25.0,230.0],[525.0,1000.0],[580.0,1175.0],[650.0,1130.0], [1605.0,620.0],[1220.0,580.0],[1465.0,200.0],[1530.0, 5.0],[845.0,680.0], [725.0,370.0],[145.0,665.0],[415.0,635.0],[510.0,875.0],[560.0,365.0], [300.0,465.0],[520.0,585.0],[480.0,415.0],[835.0,625.0],[975.0,580.0], [1215.0,245.0],[1320.0,315.0],[1250.0,400.0],[660.0,180.0],[410.0,250.0], [420.0,555.0],[575.0,665.0],[1150.0,1160.0],[700.0,580.0],[685.0,595.0], [685.0,610.0],[770.0,610.0],[795.0,645.0],[720.0,635.0],[760.0,650.0], [475.0,960.0],[95.0,260.0],[875.0,920.0],[700.0,500.0],[555.0,815.0], [830.0,485.0],[1170.0, 65.0],[830.0,610.0],[605.0,625.0],[595.0,360.0], [1340.0,725.0],[1740.0,245.0]] win = Tk() #設置標題 win.title("我的世界") #設置寬和高 win.geometry('800x600') frame = Frame(win) #創建畫佈,設置背景色,高,寬 canvas = Canvas(frame,bg='#EBEBEB',width=800,height=800,scrollregion=(0,0,2000,1200)) for x,y in pos: canvas.create_oval(x - 5, y - 5, x + 5, y + 5, fill='#ff0000', outline="#000000", tags="node") canvas.create_text(x, y - 10, text='(' + str(x) + ',' + str(y) + ')', fill='black', tags="text") hbar = Scrollbar(frame,orient=HORIZONTAL) # 定義水平滾動條 hbar.pack(side=BOTTOM, fill=X) # 放置水平滾動條在最下側,占滿X軸 hbar.config(command=canvas.xview)# 設置水平滾動條的函數與畫佈的X軸滾動條事件綁定 vbar = Scrollbar(frame,orient=VERTICAL) # 定義垂直滾動條 vbar.pack(side=RIGHT, fill=Y) # 放置垂直滾動條在最右側,占滿Y軸 vbar.config(command=canvas.yview)# 設置垂直滾動條的函數與畫佈的Y軸滾動條事件綁定 canvas.config(xscrollcommand=hbar.set, yscrollcommand=vbar.set) # 設置畫佈的X,Y軸滾動條函數與垂直滾動條綁定 canvas.pack(expand=True, fill=BOTH) frame.pack(expand=True, fill=BOTH) def run(): length = len(pos) path = [x for x in range(length)] random.shuffle(path) time.sleep(1) for i in range(length - 1): canvas.create_line(pos[i], pos[i + 1], fill='#000000', tags="line", arrow=LAST, width=1) time.sleep(1) if __name__ == '__main__': #刪除tags = "text" # canvas.delete("text") t = threading.Thread(target=run) t.start() win.mainloop()
暫定版本
個人知識還是不夠,裡面還有很多小bug,容我再思考思考
import time from tkinter import * import random import sys import threading class TSP(object): def __init__(self,root,cities:list[list]): self.__root = root self.__root.geometry('800x600') self.__root.title("TSP蟻群算法(n:初始化 e:開始搜索 s:停止搜索 c:繼續搜索 q:退出程序)") self.__frame = Frame(root) self.__canvas = Canvas(self.__frame,bg='#EBEBEB',width=800,height=800,scrollregion=(0,0,2000,1200)) hbar = Scrollbar(self.__frame, orient=HORIZONTAL) # 定義水平滾動條 hbar.pack(side=BOTTOM, fill=X) # 放置水平滾動條在最下側,占滿X軸 hbar.config(command=self.__canvas.xview) # 設置水平滾動條的函數與畫佈的X軸滾動條事件綁定 vbar = Scrollbar(self.__frame, orient=VERTICAL) # 定義垂直滾動條 vbar.pack(side=RIGHT, fill=Y) # 放置垂直滾動條在最右側,占滿Y軸 vbar.config(command=self.__canvas.yview) # 設置垂直滾動條的函數與畫佈的Y軸滾動條事件綁定 self.__canvas.config(xscrollcommand=hbar.set, yscrollcommand=vbar.set) # 設置畫佈的X,Y軸滾動條函數與垂直滾動條綁定 self.__canvas.pack(expand=True, fill=BOTH) self.__frame.pack(expand=True, fill=BOTH) self.setCity(cities) self.__lock = threading.RLock() # 線程鎖 self.__bindEvents() self.__new() def setCity(self,cities:list[list]): self.__cities = cities def sefPathsAndValues(self,paths:[list],values:list): self.__paths = paths self.__values = values # 按鍵響應程序 def __bindEvents(self): self.__root.bind("q", self.__quite) # 退出程序 self.__root.bind("n", self.__new) # 初始化 self.__root.bind("e", self.__search_path) # 開始搜索 self.__root.bind("s", self.__stop) # 停止搜索 self.__root.bind("c", self.__continue) # 繼續搜索 #初始化 def __new(self,event=None): self.__lock.acquire() #上鎖 self.__running = False #標志位 self.__lock.release() #釋放鎖 for x, y in self.__cities: self.__canvas.create_oval(x - 5, y - 5, x + 5, y + 5, fill='#ff0000', outline="#000000", tags="node") self.__canvas.create_text(x, y - 10, text='(' + str(x) + ',' + str(y) + ')', fill='black', tags="text") def __quite(self,event=None): self.__lock.acquire() # 上鎖 self.__running = False # 標志位 self.__lock.release() # 釋放鎖 self.__root.destroy() print(u"\n程序已退出...") sys.exit() # 停止搜索 def __stop(self,event=None): self.__lock.acquire() # 上鎖 self.__running = False # 標志位 self.__lock.release() # 釋放鎖 def __line(self,path:list): self.__canvas.delete("line") i = 0 while self.__running: if i == len(self.__cities) -1: break p1, p2 = self.__cities[path[i]], self.__cities[path[i + 1]] self.__canvas.create_line(p1, p2, fill='#000000', tags="line", arrow=LAST, width=1) self.__canvas.update() self.__canvas.after(500) i = i+1 # 開始搜索 def __search_path(self,event=None): self.__lock.acquire() # 上鎖 self.__running = True # 標志位 self.__lock.release() # 釋放鎖 while self.__running: x = random.randint(10,100) label = Label(self.__canvas,text="最佳路徑總距離:"+str(x)).place(x=10,y=30) self.__canvas.update() path = [x for x in range(len(self.__cities))] random.shuffle(path) self.__line(path) def __continue(self,event=None): self.__lock.acquire() # 上鎖 self.__running = True # 標志位 self.__lock.release() # 釋放鎖 def mainloop(self): self.__root.mainloop() if __name__ == '__main__': tsp = TSP(Tk(),cities) tsp.mainloop()
總結
本篇文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!
推薦閱讀:
- Tkinter canvas的畫佈參數,刪除組件,添加垂直滾動條詳解
- Python Tkinter Canvas畫佈控件詳解
- Python基礎學習之奇異的GUI對話框
- Python 蟻群算法詳解
- Python之tkinter面板PanedWindow的使用