我能够创建一个画布,并使用乌龟填充自己想要的形状。我也成功地对其进行了动画功能,但是现在无法使用我在父函数中创建的按钮。我还尝试使用无限循环内部的"button-1"点击功能,这些功能都不可可。这是代码:
import time
from tkinter import *
import tkinter as tk
import turtle
import random
class Application(Frame):
def __init__(self, master):
super(Application, self).__init__(master)
self.switcher = True
self.speedx = 5
self.speedy = 5
self.position_x = 0
self.position_y = 0
self.red_clicks_dva = 0
self.green_clicks_dva = 0
self.acuity_list_dva = [60,36,24,18,12,9,6,5,4,3,2.5,2,1.5,1]
self.acuity_list_4m_dva = [40,24,16,12,8,6,4,3.33,2.67,2,1.67,1.33,1,0.67]
self.characters_dva = ['draw_c','draw_z','draw_o','draw_t','draw_p','draw_f','draw_e','draw_h','draw_v','draw_d','draw_s','draw_n','draw_r']
self.width_value = my_window.winfo_screenwidth()
self.height_value = my_window.winfo_screenheight()
self.launch_dva()
def launch_dva(self):
for item in my_window.winfo_children():
item.destroy()
position = self.green_clicks_dva
selected_characters_dva = random.sample(self.characters_dva,1)
print(selected_characters_dva)
width = self.acuity_list_4m_dva[position]*0.00145*100
self.width_pixel_dva = (width*96)/2.54
self.canvas1 = tk.Canvas(my_window,height=self.width_pixel_dva+10,width=self.width_pixel_dva+10,bg='white',highlightthickness=0)
self.canvas1.pack_propagate(False)
self.canvas1.pack()
self.canvas1.place(x=self.position_x,y=self.position_y)
self.canvas2 = tk.Canvas(my_window,height=self.width_pixel_dva+10,width=self.width_pixel_dva+10,bg='white',highlightthickness=0)
self.canvas2.pack_propagate(False)
self.canvas2.pack()
self.canvas2.place(x=self.position_x,y=self.position_y)
turtle_name = turtle.RawTurtle(self.canvas1)
turtle_name.speed('fastest')
turtle_name.color("black", "white")
self.draw_c(turtle_name,self.width_pixel_dva,0)
turtle_name2 = turtle.RawTurtle(self.canvas2)
turtle_name2.speed('fastest')
turtle_name2.color("black", "white")
self.draw_c(turtle_name2,self.width_pixel_dva,0)
self.greenbutton_dva = PhotoImage(file = '/home/vevek/Applications/RoundGreen.png')
self.yellowbutton_dva = PhotoImage(file = '/home/vevek/Applications/RoundYellow.png')
self.redbutton_dva = PhotoImage(file = '/home/vevek/Applications/Resized red.png')
self.yellow_dva = Button(my_window, image = self.yellowbutton_dva,borderwidth = 0,bg="white",highlightthickness=0)
self.yellow_dva.pack(pady = 10)
self.yellow_dva.place(x=width_value/2,y=height_value-height_value/4,anchor = "center")
self.green_dva = Button(my_window,image = self.greenbutton_dva,bg = "white",command = self.greenbutton_dva,highlightthickness=0,borderwidth = 0)
self.green_dva.pack(padx = 10)
self.green_dva.place(x=(width_value/2)-100,y=height_value-height_value/4,anchor = "center")
self.red_dva = Button(my_window,image = self.redbutton_dva,bg = "white",command = self.redbutton_dva,highlightthickness=0,borderwidth = 0)
self.red_dva.pack(padx = 10)
self.red_dva.place(x=(width_value/2)+100,y=height_value-height_value/4,anchor = "center")
self.move_canvas()
my_window.after(0,self.switch_canvas)
def move_canvas(self):
self.position_x += self.speedx
self.position_y += self.speedy
if(self.switcher):
self.canvas1.place(x=self.position_x,y=self.position_y)
else:
self.canvas2.place(x=self.position_x,y=self.position_y)
my_window.update()
if self.position_x+self.width_pixel_dva >= self.width_value or self.position_x <= 0:
self.speedx *= -1
if self.position_y+self.width_pixel_dva >= (3*self.height_value/4)-100 or self.position_y <= 0:
self.speedy *= -1
def switch_canvas(self):
if(self.switcher):
self.canvas2.pack_forget()
self.move_canvas()
else:
self.canvas1.pack_forget()
self.move_canvas()
self.switcher = not self.switcher
my_window.after(10,self.switch_canvas)
def greenbutton_dva(self):
self.green_clicks_dva += 1
self.launch_dva()
def redbutton_dva(self):
print("Your dynamic visual acuity is "+str(self.acuity_list_dva[green_clicks_dva]))
self.dva_done_flag = 1
my_window.destroy()
def draw_c(turtle,width,shade):
turtle.penup()
turtle.setposition(((width/2)-(width/5)),-((width/4)))
turtle.pendown()
turtle.shape("blank")
turtle.pensize(width/5)
turtle.pencolor(shade,shade,shade)
turtle.left(50)
turtle.circle((width/2-width/10),-280)
turtle.penup()
return turtle.turtlesize()
my_window = tk.Tk()
width_value = my_window.winfo_screenwidth()
height_value = my_window.winfo_screenheight()
my_window.geometry("%dx%d+0+0" % (width_value,height_value))
my_window.configure(bg = 'white')
my_window.title('EYIRIS')
app = Application(my_window)
my_window.mainloop()
动画开始时,如何使"greenbutton"和"redbutton"起作用?
分析解答
Windows的答案: 我了解到,由于无限运行的动画,无法执行该按钮定义的动作。 (缺乏英语)
在这种情况下,您可以考虑一种在单独线程中进行动画的方法。 并设置相同的变量名称和函数名称使调试变得困难。
这是带有一些随机编辑的代码。 我想给出一个详细的解释,想知道为什么原始代码中有一个黄色按钮,但我不擅长英语,所以我只关注这个问题。
import time
from tkinter import *
import tkinter as tk
import turtle
import random
from threading import Thread
class Application(Frame):
def __init__(self, master):
super(Application, self).__init__(master)
self.switcher = True
self.speedx = 5
self.speedy = 5
self.position_x = 0
self.position_y = 0
self.red_clicks_dva = 0
self.green_clicks_dva = 0
self.acuity_list_dva = [60, 36, 24, 18, 12, 9, 6, 5, 4, 3, 2.5, 2, 1.5, 1]
self.acuity_list_4m_dva = [40, 24, 16, 12, 8, 6, 4, 3.33, 2.67, 2, 1.67, 1.33, 1, 0.67]
self.characters_dva = ['draw_c', 'draw_z', 'draw_o', 'draw_t', 'draw_p', 'draw_f', 'draw_e', 'draw_h', 'draw_v',
'draw_d', 'draw_s', 'draw_n', 'draw_r']
self.width_value = my_window.winfo_screenwidth()
self.height_value = my_window.winfo_screenheight()
self.launch_dva()
def launch_dva(self):
for item in my_window.winfo_children():
item.destroy()
position = self.green_clicks_dva
selected_characters_dva = random.sample(self.characters_dva, 1)
print(selected_characters_dva)
width = self.acuity_list_4m_dva[position] * 0.00145 * 100
self.width_pixel_dva = (width * 96) / 2.54
self.canvas1 = tk.Canvas(my_window, height=self.width_pixel_dva + 10, width=self.width_pixel_dva + 10,
bg='white', highlightthickness=0)
self.canvas1.pack_propagate(False)
self.canvas1.pack()
self.canvas1.place(x=self.position_x, y=self.position_y)
self.canvas2 = tk.Canvas(my_window, height=self.width_pixel_dva + 10, width=self.width_pixel_dva + 10,
bg='white', highlightthickness=0)
self.canvas2.pack_propagate(False)
self.canvas2.pack()
self.canvas2.place(x=self.position_x, y=self.position_y)
turtle_name = turtle.RawTurtle(self.canvas1)
turtle_name.speed('fastest')
turtle_name.color("black", "white")
self.draw_c(turtle_name, self.width_pixel_dva, 0)
turtle_name2 = turtle.RawTurtle(self.canvas2)
turtle_name2.speed('fastest')
turtle_name2.color("black", "white")
self.draw_c(turtle_name2, self.width_pixel_dva, 0)
self.greenbutton_dva = PhotoImage(file='/home/vevek/Applications/RoundGreen.png')
self.yellowbutton_dva = PhotoImage(file='/home/vevek/Applications/RoundYellow.png')
self.redbutton_dva = PhotoImage(file='/home/vevek/Applications/Resized red.png')
self.yellow_dva = Button(my_window, image=self.yellowbutton_dva, borderwidth=0, bg="white",
highlightthickness=0)
self.yellow_dva.pack(pady=10)
self.yellow_dva.place(x=width_value / 2, y=height_value - height_value / 4, anchor="center")
self.green_dva = Button(my_window, image=self.greenbutton_dva, bg="white", command=self.greenbutton_dva_clicked,
highlightthickness=0, borderwidth=0)
self.green_dva.pack(padx=10)
self.green_dva.place(x=(width_value / 2) - 100, y=height_value - height_value / 4, anchor="center")
self.red_dva = Button(my_window, image=self.redbutton_dva, bg="white", command=self.redbutton_dva_clicked,
highlightthickness=0, borderwidth=0)
self.red_dva.pack(padx=10)
self.red_dva.place(x=(width_value / 2) + 100, y=height_value - height_value / 4, anchor="center")
self.move_canvas()
self.t1 = Thread(target=self.switch_canvas)
self.t1.start()
# my_window.after(0, self.switch_canvas)
def move_canvas(self):
self.position_x += self.speedx
self.position_y += self.speedy
if (self.switcher):
self.canvas1.place(x=self.position_x, y=self.position_y)
else:
self.canvas2.place(x=self.position_x, y=self.position_y)
my_window.update()
if self.position_x + self.width_pixel_dva >= self.width_value or self.position_x <= 0:
self.speedx *= -1
if self.position_y + self.width_pixel_dva >= (3 * self.height_value / 4) - 100 or self.position_y <= 0:
self.speedy *= -1
def switch_canvas(self):
if (self.switcher):
self.canvas2.pack_forget()
self.move_canvas()
else:
self.canvas1.pack_forget()
self.move_canvas()
self.switcher = not self.switcher
my_window.after(10, self.switch_canvas)
def greenbutton_dva_clicked(self):
self.green_clicks_dva += 1
print("green button clicked")
# self.launch_dva()
def redbutton_dva_clicked(self):
print("Your dynamic visual acuity is " + str(self.acuity_list_dva[self.green_clicks_dva]))
self.dva_done_flag = 1
# self.test_page()
def draw_c(self, turtle, width, shade):
turtle.penup()
turtle.setposition(((width / 2) - (width / 5)), -((width / 4)))
turtle.pendown()
turtle.shape("blank")
turtle.pensize(width / 5)
turtle.pencolor(shade, shade, shade)
turtle.left(50)
turtle.circle((width / 2 - width / 10), -280)
turtle.penup()
return turtle.turtlesize()
my_window = tk.Tk()
width_value = my_window.winfo_screenwidth()
height_value = my_window.winfo_screenheight()
my_window.geometry("%dx%d+0+0" % (width_value, height_value))
my_window.configure(bg='white')
my_window.title('EYIRIS')
app = Application(my_window)
my_window.mainloop()
希望这可以帮助。