Python GUI之tkinter详解
作者:繁星伴晚安 发布时间:2021-09-11 06:36:01
标签: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()
来源:https://blog.csdn.net/weixin_48180029/article/details/120638034


猜你喜欢
- python读取和保存图片5种方法对比python中对象之间的赋值是按引用传递的,如果需要拷贝对象,需要用到标准库中的copy模块方法一:利
- 如下所示:logging: config: classpath:spring-logback.xml pattern: console: &
- 本文实例讲述了python异常处理、自定义异常、断言原理与用法。分享给大家供大家参考,具体如下:什么是异常:当程序遭遇某些非正常问题的时候就
- 本文实例讲述了Python iter()函数用法。分享给大家供大家参考,具体如下:python中的迭代器用起来非常灵巧,不仅可以迭代序列,也
- 先说下自己之前的环境(都是Linux系统,差别不大):Centos7.6NVIDIA Driver Version 440.33.01(等会
- Python 通过pywin32模块调用WindowsAPI接口,实现对特定进程加载模块的枚举输出并检测该PE程序模块所启用的保护方式,此处
- 一.引言先看获取到的效果拍摄时间:2021:12:18 16:22:13照片拍摄地址:('内蒙古自治区包头市昆都仑区', &
- 写SQL语句的时候很多时候会用到filter筛选掉一些记录,SQL对筛选条件简称:SARG(search argument/SARG) wh
- <?php/* Function Written by Nelson Neoh @3/2004. For th
- MySQL的Explain命令用于查看执行效果。虽然这个命令只能搭配select类型语句使用,如果你想查看update,delete类型语句
- 本文实例为大家分享了vue实现列表倒计时的具体代码,供大家参考,具体内容如下如图10分钟倒计时在做项目的时候遇到vue列表要用到倒计时的方法
- 本文实例讲述了Python字符串拼接、截取及替换方法。分享给大家供大家参考,具体如下:python字符串连接python字符串连接有几种方法
- 人们对于那些抄袭模仿的网站有诸多抱怨,但在这篇文章中,却没有冷嘲热讽的意思。但正如他们所说,“模仿是最为忠诚的奉承形式”。“如果你确实需要借
- <html> <head> <title>Login</title> <meta ht
- 运行下面存储过程 然后直接使用 SpaceUsed 就可以查看了. 存储过程代码 程序代码 Create&n
- 排查原因,发现是80端口被其它程序占用(很常见的事情╮(╯_╰)╭)。解决方法用记事本打开目录x:\xampp\apache\conf下的h
- 本文实例讲述了django实现分页的方法。分享给大家供大家参考。具体如下:Python代码如下:#!/usr/bin/env python#
- 发送电子邮件在即时通信软件如此发达的今天,电子邮件仍然是互联网上使用最为广泛的应用之一,公司向应聘者发出录用通知、网站向用户发送一个激活账号
- Python 是一种极其多样化和强大的编程语言!当需要解决一个问题时,它有着不同的方法。在本文中,将会展示列表解析式(List Compre
- 刚开始涉及到图像处理的时候,在opencv等库中总会看到mask这么一个参数,非常的不理解,在查询一系列资料之后,写下它们,以供翻阅。什么是