题目1. 编写程序实现:在画布上显示“张三’,坐标为(0,200)、大小为40、颜色为红色,当每按下窗口左侧控制区域的“移动”按钮时字母向右移动一下,遇到边界停止,移动距离为8,增加一个按下光标右键时,名字向右移动的功能。
代码:
import tkinter as tk
class MyCanvas(tk.Canvas):
def __init__(self, master, *args, **kwargs):
super().__init__(master, *args, **kwargs)
self.name = self.create_text(0, 200, text='张三', font=('Arial', 40), fill='red')
self.itemconfig(self.name, anchor='w') #设置锚点为文字左端
self.configure(bg='black')
self.width = self.bbox(self.name)[2] - self.bbox(self.name)[0] #计算名字宽度
self.move_step = 8 #移动步长
self.bind('<Button-3>', self.move_right) #绑定右键事件
def move_right(self, event):
if self.coords(self.name)[0] + self.width < self.winfo_width(): #判断是否到达窗口右侧边缘
self.move(self.name, self.move_step, 0)
class MyButton(tk.Button):
def __init__(self, master, *args, **kwargs):
super().__init__(master, *args, **kwargs)
self.configure(bg='white')
class Window(tk.Tk):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.title('窗口')
self.geometry('500x300')
self.canvas = MyCanvas(self, width=400, height=300) #窗口大小
self.canvas.pack(side='right')
button_frame = tk.Frame(self, bg='white')
button_frame.pack(side='left', fill='y')
self.move_button = MyButton(button_frame, text='移动', command=self.move_name)
self.move_button.pack(pady=20)
MyButton(button_frame, text='key').pack(pady=20)
MyButton(button_frame, text='mouse').pack(pady=20)
def move_name(self):
if self.canvas.coords(self.canvas.name)[0] + self.canvas.width < self.canvas.winfo_width(): #判断是否到达窗口右侧边缘
self.canvas.move(self.canvas.name, self.canvas.move_step, 0)
window = Window()
window.mainloop()
代码介绍:
定义了三个类:MyCanvas、MyButton和Window。MyCanvas类继承自tk.Canvas,并在初始化方法中创建了名字文本和设置了颜色和背景色等属性。MyButton类继承自tk.Button,并在初始化方法中设置了白色背景色。Window类继承自tk.Tk,并在初始化方法中创建了一个MyCanvas对象和三个MyButton对象,并且通过bind方法和command参数分别绑定了右键事件和“移动”按钮的点击事件。
在MyCanvas类中,我们定义了一个move_right方法,用于实现名字向右移动的功能。该方法在接收到右键事件时调用,会判断名字是否到达窗口右侧边缘,如果没有,则让名字向右移动一个步长。在Window类中,我们定义了一个move_name方法,用于实现“移动”按钮的点击事件,该方法也会判断名字是否到达窗口右侧边缘,如果没有,则让名字向右移动一个步长。
运行程序后,会出现一个名字为“张三”的红色文本,背景色为黑色的画布和三个白色背景的MyButton按钮。当点击“移动”按钮时,名字将会向右移动一个步长,如果到达窗口右侧边缘,则停止移动。当按下鼠标右键时,名字也会向右移动一个步长。