我正在创建一个代码,以便当用户点击窗口时,它将根据他们选择的输入绘制形状。我在应该在哪里正确分配窗口和乌龟以及如何为函数分配一个退出当前窗口的方法时遇到了麻烦。有没有办法让我结束mainloop()
,以便用户在点击并制作所选择的多个形状后返回主菜单(假设每次选择一个选项时,窗口重置为a空白状态)?如果无法进行无限点击,那么有没有办法做到这一点但只需点击一下(然后返回主菜单)?为简单起见,我只包含一个选项,因为其他代码将是相同的。
import turtle
window = turtle.Screen()
turt = turtle.Turtle()
def U(x,y):
turt.penup()
turt.setposition(x,y)
turt.pendown()
for x in range(4):
turt.forward(100)
turt.right(90)
return
def main():
global choice
if choice.upper() == "U":
window.onscreenclick(U)
window.mainloop()
run = True
print("Please choose a drawing option: 'U' or 'q' to quit.")
while run == True:
choice = str(input())
if choice.upper() != "U" and choice.lower() != "q":
print("Invalid input. Please choose either: 'U' or 'q'.")
elif choice.upper() == "U":
main()
elif choice.lower() == 'q':
run = False
答案 0 :(得分:0)
您的控制逻辑存在缺陷。 Turtle图形是一个事件驱动的世界,因此我们需要将事件逻辑放在适当的位置,然后将控制权转移到mainloop()
以观察键盘和鼠标事件。像while True
和input()
这样的代码与此模型密谋。这是我在Python 3中以事件驱动的方式操作代码的过程:
from turtle import Turtle, Screen
TITLE = 'Drawing Options'
PROMPT = "Please choose a drawing option: 'U' or 'q' to quit."
def U(x, y):
window.onscreenclick(None)
turtle.penup()
turtle.setposition(x, y)
turtle.pendown()
for _ in range(4):
turtle.forward(100)
turtle.right(90)
def menu():
choice = ''
while choice not in ['U', 'u', 'Q', 'q']:
choice = window.textinput(TITLE, PROMPT) # may return None
if choice.upper() == 'U':
window.onscreenclick(U)
elif choice.lower() == 'q':
window.bye()
window.listen() # textinput() unsets this so redo
turtle = Turtle()
window = Screen()
window.onkey(menu, key='M')
window.listen()
window.mainloop()
运行它,选择窗口使其成为听众,然后点击资本' M' M'打开一个提示窗口,您可以在其中输入您的' U'或者' q'命令。在' U'之后,您可以使用鼠标点击任意位置。命令用你的方块设置一个位置。完成后,您可以再次键入大写' M'提起菜单并放置另一个方格或退出。
为简单起见,我没有将窗口重置为空白状态。