【发布时间】:2018-10-18 08:28:59
【问题描述】:
当我运行当前程序时,该程序上的三角形仅在我按下按钮时移动一次。我希望我的三角形每单位时间自动移动一个像素,但我不知道如何做到这一点。
到目前为止,在执行此程序时,我仍然无法弄清楚类和定义的哪些位去哪里以及如何处理这些类和定义以使它们像我想要的那样工作,如上所述。
import tkinter as tk
from tkinter import PhotoImage
from tkinter import *
import time
counter = 0
running = False
class triangle():
def trianglemovedefine(move_x, move_y):
canvas.move (triangle3, move_x, move_y)
def trianglemove():
triangle.trianglemovedefine(1, 0)
def moveitboi(justmoveit):
def count():
if running:
global counter
justmoveit = lambda:triangle.trianglemove()
#My "per unit time" adjusted to per 1000 microseconds
justmoveit.after(1000, count)
counter += 1
count()
def Start(justmoveit):
global running
running=True
moveitboi(justmoveit)
root = tk.Tk()
root.geometry("960x600")
label_toptitle = tk.Label(root, text="Program Name", font=(None, 40),)
label_toptitle.grid(row=0, columnspan=3)
label_desc = tk.Label(root, image=pixel, compound="center", width=900, font=(None, 14),
padx=20, pady=10, text=description)
label_desc.grid(row=1, columnspan=3)
canvas = tk.Canvas(width=960, height=300, bg='white')
canvas.grid(row=2, column=0, columnspan=3)
for linecounter in range(49):
newtextbit = linecounter + 1
if (newtextbit + 3) % 4 == 0 and newtextbit != 49:
canvas.create_text((linecounter * 16 + 80), 90,
fill="darkblue",
font="Times 10 bold",
text=newtextbit)
if (newtextbit + 3) % 4 == 0:
canvas.create_line(((linecounter * 16 + 80)), 40, ((linecounter * 16 + 80)), 70,
width=1,
fill="black"
)
else:
canvas.create_line(((linecounter * 16 + 80)), 50, ((linecounter * 16 + 80)), 70,
width=1,
fill="black"
)
canvas.create_line(73, 70, 860, 70,
width=2,
fill="black"
)
#The Triangle
triangle3 = canvas.create_polygon(75, 25, 86, 25, 80, 40, fill ='red')
f1 = tk.Frame(root, width=70, height=30)
f1.grid(row=3, column=0, sticky='W')
button_record = tk.Button(f1,
text="Record",
compound="top",
command=lambda:triangle.trianglemove(),
)
button_record.pack(side='left', padx=140)
root.mainloop()
【问题讨论】:
-
这种事情通常是通过使用通用小部件方法
after()来完成的,它允许在指定的延迟后“调度”显示更新。这里有很多tkinter的答案展示了如何做到这一点,所以我建议你做更多的研究。回答有关如何制作时钟或制作动画的问题通常是不错的选择。 -
我确实有
after()小部件,但我的问题是如何让我的after()小部件按预期工作。到目前为止,按下按钮仅手动按下三角形一次。我尝试等待程序再次将三角形移动一秒钟,但我没有看到任何移动。 -
@martineau 我尝试寻找其中一些类型的问题,但找不到任何问题。我应该查看任何推荐的 URL 链接吗?
-
您的
moveitboi()函数只调用一次after()。需要一遍又一遍地调用它以使事情继续进行。给我一分钟,我会尽力为你找到一个好的…… -
好的,但我目前不知道如何让函数一遍又一遍地调用
after()小部件。我请求一些代码解决方案。
标签: python python-3.x tkinter