千家信息网

如何理解Python GUI中的tkinter

发表于:2025-01-22 作者:千家信息网编辑
千家信息网最后更新 2025年01月22日,这篇文章主要介绍"如何理解Python GUI中的tkinter",在日常操作中,相信很多人在如何理解Python GUI中的tkinter问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法
千家信息网最后更新 2025年01月22日如何理解Python GUI中的tkinter

这篇文章主要介绍"如何理解Python GUI中的tkinter",在日常操作中,相信很多人在如何理解Python GUI中的tkinter问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"如何理解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 randomif __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 timefrom tkinter import *import randomimport threadingpos = [[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 timefrom tkinter import *import randomimport sysimport threadingclass 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()

到此,关于"如何理解Python GUI中的tkinter"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

0