python canvas绘制圆形
时间: 2023-07-17 13:01:02 浏览: 129
在Python中,你可以使用`tkinter`库的`create_oval`方法来绘制圆形。以下是一个简单的示例:
```python
from tkinter import *
# 创建窗口
window = Tk()
# 创建Canvas对象
canvas = Canvas(window, width=400, height=400)
canvas.pack()
# 绘制圆形
canvas.create_oval(50, 50, 150, 150, fill='red')
# 运行窗口主循环
window.mainloop()
```
这个示例创建了一个窗口,并在窗口中绘制了一个红色的圆形。`create_oval`方法接受四个参数,分别是圆形的左上角和右下角的坐标。你可以根据需要调整这些坐标来绘制不同大小和位置的圆形。
相关问题
python tkinter Canvas 绘制仪表
### 使用 Tkinter Canvas 组件绘制仪表盘
为了创建一个功能性的仪表盘,可以使用 `tkinter` 库中的 `Canvas` 组件来绘制图形元素。下面是一个简单的例子,展示如何构建一个基本的圆形仪表盘。
#### 创建基础窗口并初始化画布
首先,导入必要的模块,并设置主应用程序窗口以及用于绘图的画布对象:
```python
import tkinter as tk
from math import pi, sin, cos
class Speedometer(tk.Frame):
def __init__(self, master=None, **kwargs):
super().__init__(master, **kwargs)
self.width = 400
self.height = 250
# 初始化画布
self.canvas = tk.Canvas(self, bg="white", width=self.width, height=self.height)
self.pack()
self.canvas.pack()
# 调用方法绘制速度表
self.draw_speedometer()
```
这段代码定义了一个继承自 `Frame` 类的新类 `Speedometer`,其中包含了用来放置所有组件的小部件容器[^1]。
#### 定义绘制函数
接下来,在上述类内部添加一个新的成员函数 `draw_speedometer()` 来完成实际的绘画工作:
```python
def draw_speedometer(self):
center_x = self.width / 2
center_y = self.height * (7/8)
radius = min(center_x, center_y) - 30
start_angle = (-90 - 120) * pi / 180
# 绘制圆弧背景
coords = [
center_x - radius,
center_y - radius,
center_x + radius,
center_y + radius]
self.canvas.create_arc(
coords,
start=start_angle*180/pi,
extent=(end_angle-start_angle)*180/pi,
style=tk.ARC,
outline="black",
width=2)
# 添加刻度标记和数值标签
num_ticks = 10
tick_length = 10
angle_range = abs(end_angle - start_angle)/num_ticks
for i in range(num_ticks+1):
current_angle = start_angle+i*(angle_range)-pi/2
inner_radius = radius-tick_length//2
outer_radius = radius+tick_length//2
x_inner = int(center_x + inner_radius*cos(current_angle))
y_inner = int(center_y + inner_radius*sin(current_angle))
x_outer = int(center_x + outer_radius*cos(current_angle))
y_outer = int(center_y + outer_radius*sin(current_angle))
self.canvas.create_line(x_inner,y_inner,x_outer,y_outer,width=2)
value_text = str(int(i/(num_ticks)*(max_value-min_value)+min_value))+" km/h"
text_position = (
int(center_x+(inner_radius-20)*cos(current_angle)),
int(center_y+(inner_radius-20)*sin(current_angle)))
self.canvas.create_text(text_position,text=value_text,font=('Arial', 10,'bold'))
# 中心指针
needle_width = 3
needle_height = radius*.6
def update_needle(value):
nonlocal max_value,min_value,start_angle,end_angle,radius,center_x,center_y
percent_complete = ((value-min_value)/(max_value-min_value))
target_angle = start_angle-percent_complete*(start_angle-end_angle)
points=[
center_x-int(needle_width/2),
center_y,
center_x+int(cos(target_angle-pi/2)*needle_width/2),
center_y-int(sin(target_angle-pi/2)*needle_width),
center_x+int(cos(target_angle)*needle_height),
center_y-int(sin(target_angle)*needle_height),
center_x+int(-cos(target_angle+pi/2)*needle_width/2),
center_y-int(-sin(target_angle+pi/2)*needle_width),
center_x-int(needle_width/2),
center_y]
self.canvas.coords('needle',points)
initial_value = 0
max_value = 180
min_value = 0
update_needle(initial_value)
self.needle_polygon = self.canvas.create_polygon([0]*10,outline='red',fill='',width=needle_width,tags='needle')
```
此部分实现了仪表盘的主要视觉效果,包括外圈、刻度线及其对应的文本标注,还有随数据变化而旋转的方向指示器(即指针)。这里假设最大读数为 `180km/h` 和最小读数为 `0km/h` ,可以根据具体需求调整这些参数。
最后一步是在脚本结尾处实例化这个新创建的速度计小部件,并启动事件循环以保持 GUI 响应状态:
```python
if __name__ == '__main__':
root = tk.Tk()
app = Speedometer(master=root)
app.mainloop()
```
以上就是完整的示例程序,它展示了怎样利用 Python 的 `tkinter` 模块下的 `Canvas` 小部件来实现一个简易但实用的模拟速度计界面。
python canvas画球
Python中的canvas是一个图形库,可以用来绘制各种形状,包括圆形。在canvas中,可以使用create_oval()方法来绘制圆形,该方法需要提供圆形的左上角和右下角坐标。同时,可以使用move()方法来移动圆形的位置。因此,可以通过不断地移动圆形的位置来实现小球满屏乱跑的效果。
下面是一个简单的示例代码,实现了在canvas上画一个小球并让它满屏乱跑的效果:
```
import tkinter as tk
import random
# 创建窗口和canvas
root = tk.Tk()
canvas = tk.Canvas(root, width=500, height=500)
canvas.pack()
# 画一个小球
ball = canvas.create_oval(0, 0, 20, 20, fill='red')
# 随机生成小球的初始位置和速度
x = random.randint(0, 480)
y = random.randint(0, 480)
vx = random.randint(-5, 5)
vy = random.randint(-5, 5)
# 移动小球的函数
def move_ball():
global x, y, vx, vy
# 移动小球
canvas.move(ball, vx, vy)
x, y = canvas.coords(ball)[:2]
# 碰到边缘反弹
if x < 0 or x > 480:
vx = -vx
if y < 0 or y > 480:
vy = -vy
# 重复调用move_ball函数
canvas.after(50, move_ball)
# 调用move_ball函数开始移动小球
move_ball()
# 进入消息循环
root.mainloop()
```
阅读全文
相关推荐















