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

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • Python Tkinter模块 GUI 可视化实例

    我就废话不多说了,直接上代码: coding:utf-8 #自带的Tkinter模块 from Tkinter import * from ScrolledText import ScrolledText #gui框 root = Tk() root.title('视频多线程') #窗口坐标和大小 +代表调整坐标 x代表调整大小 root.geometry('500x500+200+100') #滚动条 text = ScrolledText(root,font=('微软雅黑',10)) #实现

  • Python Tkinter GUI编程入门介绍

    一.Tkinter介绍 Tkinter是一个python模块,是一个调用Tcl/Tk的接口,它是一个跨平台的脚本图形界面接口.Tkinter不是唯一的python图形编程接口,但是是其中比较流行的一个.最大的特点是跨平台,缺点是性能不太好,执行速度慢. 一般使用Tkinter的方法是: From Tkinter import * 或者: import Tkinter 两者的区别我们前面讲模块的时候已经说过了.   二.Tkinter的使用 先看一下GUI程序的开发,熟悉MFC的朋友应该不会陌生.

  • python用tkinter实现一个gui的翻译工具

    #!/usr/bin/env python # -*- coding: utf-8 -*- from tkinter import * import hashlib import time import json import requests import random LOG_LINE_NUM = 0 class MY_GUI(): def __init__(self,init_window_name): self.init_window_name = init_window_name se

  • Python GUI Tkinter简单实现个性签名设计

    一.Tkinter的介绍和简单教程 Tkinter 是 Python 的标准 GUI 库.Python 使用 Tkinter 可以快速的创建 GUI 应用程序. 由于 Tkinter 是内置到 python 的安装包中.只要安装好 Python 之后就能 import Tkinter 库.而且 IDLE 也是用 Tkinter 编写而成.对于简单的图形界面 Tkinter 还是能应付自如. 注意:Python3.x 版本使用的库名为 tkinter,即首写字母 T 为小写. import tki

  • Python GUI之如何使用tkinter控件

    一.功能按钮 格式:Button(父对象,options,-) 父对象:表示当前按钮建立在哪一个窗口下. options:下面总结一部常用的. 1.bg或者background:背景色 2.fg或者foreground:前景色 3.command:单击按钮时,执行此方案 4.font:字体 5.height:字符高度 6.width:字符宽度 7.image:按钮上的图片 8.padx:设置文字与按钮左右间隔 9.pady:设置文字与按钮上下间隔 10.state:NORMAL表示启用按钮,DI

  • 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,

  • Python可视化tkinter详解

    目录 1.基本用法 2.常用标签 1.基本用法 # coding:utf-8 import tkinter as tk # 创建窗口对象 window = tk.Tk() # 设置串口标题 window.title("Python GUI") # 设置窗口大小 window.geometry("600x100") # 固定写法,600x600, 单位为像素 # 使用窗口对象 window.mainloop() 2.常用标签 # coding:utf-8 import

  • 基于python图书馆管理系统设计实例详解

    写完这个项目后,导师说这个你完全可以当作毕业项目使用了,写的很全,很多的都设计考虑周全,但我的脚步绝不止于现在,我想要的是星辰大海!与君共勉! 这个项目不是我的作业, 只是无意中被拉进来了,然后就承担了所有,肝了一周多,终于完成,但这个也算是一个很大的项目了吧,对于我现在来说,写这个项目遇到了很多困难,这是真的,其中涉及到数据库的使用,就遇到了一点瓶颈, 但这不算什么,还是要被我搞定的. 梦想就像这个远处夕阳,终究触手可及! Python项目: 项目前提: 这个项目涉及到的知识点有很多, 知识串

  • Python内置模块turtle绘图详解

    urtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x.纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行的路径上绘制了图形. turtle绘图的基础知识: 1.画布(canvas) 画布就是turtle为我们展开用于绘图区域,我们可以设置它的大小和初始位置. 设置画布大小 turtle.screensize(canvwidth=None,canvheight=None,bg=None),参数分别为画布的

  • Python opencv操作深入详解

    直接读取图片 def display_img(file="p.jpeg"): img = cv.imread(file) print (img.shape) cv.imshow('image',img) cv.waitKey(0) cv.destroyAllWindows() 读取灰度图片 def display_gray_img(file="p.jpeg"): img = cv.imread(file,cv.IMREAD_GRAYSCALE) print (img

  • Python双版本计算器详解

    有框计算器 这个计算器我们用到了Python自带的Tkinter库 # 导入tkinter库 import tkinter 我们要对窗口进行一些基本操作 # 获取一个窗口 window = tkinter.Tk() # 设置标题 window.title('计算器') # 设置窗口大小 window.geometry('200x200') 接着用函数定义一个输入方法 输入方法 # 输入方法 def add(n): # 获取到n1文本框的值 n1 = inp.get() # 清空文本框 inp.d

  • Python Matplotlib marker 标记详解

    目录 前言 1.标记(Markers) 2.标记参考(Marker Reference) 3.Format Strings fmt 4.线参考(Line Reference) 5.颜色参考(Color Reference) 6.标记大小(Marker Size) 7.标记颜色(Marker Color) 前言 Matplotlib,风格类似 Matlab 的基于 Python 的图表绘图系统. Matplotlib 是 Python 最著名的绘图库,它提供了一整套和 Matlab 相似的命令 A

  • MySQL数据库设计之利用Python操作Schema方法详解

    弓在箭要射出之前,低声对箭说道,"你的自由是我的".Schema如箭,弓似Python,选择Python,是Schema最大的自由.而自由应是一个能使自己变得更好的机会. Schema是什么? 不管我们做什么应用,只要和用户输入打交道,就有一个原则--永远不要相信用户的输入数据.意味着我们要对用户输入进行严格的验证,web开发时一般输入数据都以JSON形式发送到后端API,API要对输入数据做验证.一般我都是加很多判断,各种if,导致代码很丑陋,能不能有一种方式比较优雅的验证用户数据呢

  • Python之str操作方法(详解)

    1. str.format():使用"{}"占位符格式化字符串(占位符中的索引号形式和键值对形式可以混合使用). >>> string = 'python{}, django{}, tornado{}'.format(2.7, 'web', 'tornado') # 有多少个{}占位符就有多少个值与其对应,按照顺序"填"进字符串中 >>> string 'python2.7, djangoweb, tornadotornado'

  • 基于python时间处理方法(详解)

    在处理数据和进行机器学习的时候,遇到了大量需要处理的时间序列.比如说:数据库读取的str和time的转化,还有time的差值计算.总结一下python的时间处理方面的内容. 一.字符串和时间序列的转化 time.strptime():字符串=>时间序列 time.strftime():时间序列=>字符串 import time start = "2017-01-01" end = "2017-8-12" startTime = time.strptime

随机推荐