【问题标题】:Python turtle program works in IDLE, not otherwisePython 乌龟程序在 IDLE 下工作,否则不工作
【发布时间】:2017-09-15 12:33:41
【问题描述】:

我在 Python 中使用海龟创建了一个简单的按钮程序。 它很可能非常草率,但在 IDLE 中完美运行。但是,当尝试在没有 IDLE 的情况下加载它时,它只会绘制两个按钮,然后退出程序。我查看了代码,但没有成功找到原因。

这就是我认为问题所在(最后几行):

def main():
    onscreenclick(Button.clicked,1)

main()

但是我不完全确定。这是完整的程序以防万一。

from turtle import *
bgcolor('skyblue')
penup()
left(90)
speed(0)
hideturtle()
buttonlist = []

class Button:
  x_click = 0
  y_click = 0
  def __init__(self, x, y, size, color, text, fontsize, fixvalue):
    self.x = x
    self.y = y
    self.size = size
    self.color = color
    self.text = text
    self.fontsize = fontsize
    self.fixvalue = fixvalue
  def showButton(self):
    goto(self.x , self.y)
    pendown()
    fillcolor(self.color)
    begin_fill()
    for i in range(4):
      forward(self.size)
      right(90)
    end_fill()
    penup()
    goto((self.x+self.size/2),self.y+self.fixvalue)
    right(90)
    write(self.text, move=False, align="center", font=("Arial", self.fontsize, "normal"))
    left(90)
  def hideButton(self):
    goto(self.x, self.y)
    fillcolor('skyblue')
    pencolor('skyblue')
    pendown()
    begin_fill()
    for i in range(4):
      forward(self.size)
      right(90)
    end_fill()
    penup()
    pencolor('black')
  def checkClick(self):
    if self.x < Button.x_click:
      if Button.x_click < (self.x+self.size):
        if self.y < Button.y_click:
          if Button.y_click < (self.y+self.size):
            return 1

  def clicked(x, y):
    Button.x_click = x
    Button.y_click = y

    if home_1.checkClick() == 1:
      home_1.hideButton()
    if home_2.checkClick() == 1:
      home_2.hideButton()

home_1 = Button(10,10,100,'red','←',45,20)
home_2 = Button(-50,-50,50,'blue','Hello!',10,15)
Button.showButton(home_1)
Button.showButton(home_2)

def main():
    onscreenclick(Button.clicked,1)

main()

希望有解决办法。

干杯。

【问题讨论】:

  • 请使用代码块而不是某个网络服务的链接添加您的代码,并提供MCVE
  • 我强烈建议你停止使用from turtle import * 而只是使用import turtle 并通过turtle.penup() 等使用函数。现在一遍又一遍地写同样的东西可能会觉得很愚蠢无处不在,但你未来的自己会感谢你。导入很多这样的短名称很快就会变得非常混乱。
  • import turtle as tt,例如使用tt.penup()

标签: python turtle-graphics python-idle


【解决方案1】:

您说得对,问题在于main() 函数,请尝试在末尾添加turtle.mainloop() 调用:

def main():
    onscreenclick(Button.clicked,1)
    mainloop()

main()

如果这对您不起作用,您也可以尝试turtle.done() 功能,尽管我建议您先尝试mainloop()

def main():
    onscreenclick(Button.clicked,1)
    done()

main()

【讨论】:

    【解决方案2】:

    turtle 基于tkinter,它基于 tcl/tk GUI 框架。 Turtle 的mainloop 最终调用了 tcl 事件处理程序mainloop,它反复调用 tcl 的 update() 函数,该函数处理挂起的事件并更新屏幕。 Tcl 的 mainloop 保持控制直到它被显式退出,例如关闭海龟窗口。

    IDLE 通过定期调用 tcl 的更新来帮助海龟和 tkinter 的开发和学习不阻塞,因此人们可以(暂时)省略调用 mainloop 并通过输入命令与正在处理的屏幕进行交互在空闲外壳中。但是在 IDLE 之外运行时需要重新添加 mainloop。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-13
      • 2014-03-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多