1 说明:

=====

1.1 动态雷达示意图,用python来实现,我介绍过2篇:opencv(cv2)法和pygame法,虽然也是本人原创,但是我不敢勾选原创。

《雷达模拟:用python的pygame实现和代码分析》

1.2 今天用tkinter来实现动态雷达示意图,是本人原创,勾选看看,网上目前没有这个,欢迎大家一起学习和探讨,也欢迎转载,但注明出处即可。

1.3 知识点:在python的tkinter中涉及到如何画圆,选用线程和线程报错问题。

1.4 复习python的相关知识。

2 环境:

python3.8+内置tkinter+微软编辑器vscode+深度deepinlinux操作系统。

3 python3,不需要设置编码声明,复习一下:

# coding:utf-8 #或者下面 # -*- coding:utf-8 -*-

2.x版本的py文件:一般默认的是ASCII码。

如果文件里有中文,运行时会出现乱码,注释中的中文也不行。

因此,需要把文件编码类型改为utf-8的类型,

输入# -*- coding:utf-8 -*-之后会把文件编码强制转换为utf-8。

3.x版本的py文件的默认编码为Unicode。


3 第1步:导入模块

import tkinter import time import math import threading

4 第2步:窗口初始化

width=height=1000 #宽和高,建议相等,便于后面调用 #初始化一个tk t = tkinter.Tk() t.title("Python Tkinter Radar") #窗口标题名 #定义一个画布,大小,背景颜色 canvas = tkinter.Canvas(width=width, height=height, bg='black') #居中挂起 canvas.pack()

5 第3步:画同心圆函数和初始化参数

#注意:tkinter没有画圆函数,只有画椭圆函数 #画布,圆点坐标,半径r,线条颜色 def circle(canvas, x, y, r,outline): canvas.create_oval(x-r, y-r, x+r, y+r,outline='green') #画圆函数初始定义 r=50 #最小同心圆半径 #同心圆的圆点坐标 x=int(width/2) y=int(height/2)

6 第4步:画同心圆和扇形

#扇形初始化角度 start1 =0 #初始图象 def Draw(): #全局化参数 global start1 global x global y #删除上一个图形 canvas.delete('all') #画四个同心圆 for i in range(0,4): circle(canvas,x,y,r*(i+1),outline='green') i+=1 #画转动扇形 start1 += 30 #每次转动的角度30° #画雷达扫面扇形arc #弧外框矩形左上⻆的x坐标+y坐标,弧外框矩形右下⻆的x坐标+y坐标, #中心坐标点+最大圆的半径200 #画扇形==雷达扫描移动的扇形 a = canvas.create_arc(x+200,y+200,x-200,y-200,start=start1,extent=30,fill="green") #画坐标垂直和水平线 b=canvas.create_line(int(width/2),y-200,int(width/2),y+200, width=1, fill='white') c=canvas.create_line(x-200,int(height/2),x+200,int(height/2), width=1, fill='white') #画东西南北文字 #东=e te=canvas.create_text(x+220,int(height/2),text='E',fill='red',font=20) #南=s ts=canvas.create_text(int(width/2),y+220,text='S',fill='red',font=20) #西=w tw=canvas.create_text(x-220,int(height/2),text='W',fill='red',font=20) #北=n tn=canvas.create_text(int(width/2),y-220,text='N',fill='red',font=20)

7 第5步:延迟并画下一个图形

def delay(): while 1: time.sleep(0.1) Draw()

8 主函数调用并启动线程

if __name__ == '__main__': pt = threading.Thread(target=delay)#开启线程 pt.start() t.mainloop() #循环挂起 pt.join()

9 效果图:

10:报错:

Exception in thread Thread-1: Traceback (most recent call last): File "/usr/local/python3.8/lib/python3.8/threading.py", line 932, in _bootstrap_inner self.run() File "/usr/local/python3.8/lib/python3.8/threading.py", line 870, in run self._target(*self._args, **self._kwargs) File "/home/xgj/Desktop/tkinter-radar/10.py", line 102, in delay Draw() File "/home/xgj/Desktop/tkinter-radar/10.py", line 66, in Draw canvas.delete('all') File "/usr/local/python3.8/lib/python3.8/tkinter/__init__.py", line 2818, in delete self.tk.call((self._w, 'delete') + args) RuntimeError: main thread is not in main loop

11 解决办法:安装mtTkinter

改进版本的tkinter安装后,代码也不需要做修改

11.1 安装:

pip install mtTkinter #本机安装 sudo pip3.8 install mtTkinter

11.2 模块导入增加一行即可

from mttkinter import mtTkinter as tk

12 tkinter只有画椭圆形,没有画圆

==========================

12.1 代码一:

import tkinter t = tkinter.Tk() canvas = tkinter.Canvas(width=800, height=800, bg='white') canvas.pack() #画四个同心圆 for i in range(0,4): #画椭圆函数调用 #注意:0,0代表左上角坐标 #100,100代表右下角坐标 #当100==100,代表是圆形 canvas.create_oval(0,0,100*(1+ i),100*(1 + i), width=1) i+=1 t.mainloop()

12.2 图1:


当然,推荐pygame和opencv,tkinter不是最优选择,只是提供思路,提高python思维。