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思维。
