【问题标题】:Use tkinter buttons to control a Python turtle in another window使用 tkinter 按钮在另一个窗口中控制 Python 乌龟
【发布时间】:2018-08-13 15:31:47
【问题描述】:

我正在尝试使用 tkinter 的按钮来控制另一个图形窗口中的海龟,但按钮不起作用

我试图使用海龟图形和 Tkinter 制作一个简单的程序,用按钮控制海龟。但是,似乎只有一个按钮实际上正在运行一个功能,即使这样也会产生错误。这是我写的代码:

from tkinter import *
import turtle

global x
global y 

x = 1
y = 1
i = 0

root = Tk()

wn = turtle.Screen()
bob = turtle.Turtle()
bob.up()

def goUp(event):
    y=y+5
    bob.goto(x,y)
def goDown(event):
    y=y-5
    bob.goto(x,y)
def goRight(event):
    x=x+5
    bob.goto(x,y)
def goLeft(event):
    x=x-5
    bob.goto(x,y)

topFrame = Frame(root)
topFrame.pack()
middleFrame = Frame(root)
middleFrame.pack()
bottomFrame = Frame(root)
bottomFrame.pack()

button1 = Button(topFrame, text = "Up", fg="red")
button2 = Button(middleFrame, text = "Left", fg="red")
button3 = Button(middleFrame, text = "Right", fg="red")
button4 = Button(bottomFrame, text = "Down", fg="red")

button1.bind("<Button-1>", goUp)
button2.bind("<Button-2>", goLeft)
button3.bind("<Button-3>", goRight)
button4.bind("<Button-4>", goDown)
button1.pack()
button2.pack(side=LEFT)
button3.pack(side=RIGHT)
button4.pack()
root.mainloop()

【问题讨论】:

  • 您知道Button 类接受command 选项吗?
  • 我假设 "Up" 命令在您将其绑定到 "&lt;Button-1&gt;" 时部分工作。除非您有四键鼠标,否则您也应该将其他命令绑定到 "&lt;Button-1&gt;"。我相信他们最终都会因为滥用global关键字而失败。

标签: python tkinter turtle-graphics


【解决方案1】:

TKinter Button 类接受command 选项,您可以在其中传递按下按钮时调用的函数。您还需要访问方法中的全局 xy 变量。

试试这个代码:

from tkinter import *
import turtle

global x
global y 

x = 1
y = 1
i = 0

root = Tk()

wn = turtle.Screen()
bob = turtle.Turtle()
bob.up()

def goUp():
    global x, y
    y=y+5
    bob.goto(x,y)
def goDown():
    global x, y
    y=y-5
    bob.goto(x,y)
def goRight():
    global x, y
    x=x+5
    bob.goto(x,y)
def goLeft():
    global x, y
    x=x-5
    bob.goto(x,y)

topFrame = Frame(root)
topFrame.pack()
middleFrame = Frame(root)
middleFrame.pack()
bottomFrame = Frame(root)
bottomFrame.pack()

button1 = Button(topFrame, text = "Up", fg="red", command=goUp)
button2 = Button(middleFrame, text = "Left", fg="red", command=goLeft)
button3 = Button(middleFrame, text = "Right", fg="red", command=goRight)
button4 = Button(bottomFrame, text = "Down", fg="red", command=goDown)

button1.pack()
button2.pack(side=LEFT)
button3.pack(side=RIGHT)
button4.pack()
root.mainloop()

【讨论】:

    【解决方案2】:

    Turtle 的TurtleScreen 类通常在使用turtle.py 时使用独立。当在 tkinter 上实现的 turtle 在 tkinter 中嵌入使用时,我们通常使用 RawTurtleTurtleScreen 类来代替。您可以在 the turtle documentation 中找到更多相关信息

    您还应该查看众多online Python global keyword tutorials 之一,因为您没有正确使用它。幸运的是,我们不需要它来实现这个特定的程序。

    以下是您的代码的返工,作为单个窗口实现,说明了上述内容:

    import tkinter as tk
    from turtle import RawTurtle, TurtleScreen
    
    def goUp():
        bob.sety(bob.ycor() + 5)
    
    def goDown():
        bob.sety(bob.ycor() - 5)
    
    def goRight():
        bob.setx(bob.xcor() + 5)
    
    def goLeft():
        bob.setx(bob.xcor() - 5)
    
    root = tk.Tk()
    
    canvas = tk.Canvas(root, width=500, height=500)
    canvas.pack()
    
    wn = TurtleScreen(canvas)
    
    bob = RawTurtle(wn, shape="turtle")
    bob.penup()
    
    topFrame = tk.Frame(root)
    topFrame.pack()
    middleFrame = tk.Frame(root)
    middleFrame.pack()
    bottomFrame = tk.Frame(root)
    bottomFrame.pack()
    
    tk.Button(topFrame, text="Up", fg="red", command=goUp).pack()
    tk.Button(middleFrame, text="Left", fg="red", command=goLeft).pack(side=tk.LEFT)
    tk.Button(middleFrame, text="Right", fg="red", command=goRight).pack(side=tk.RIGHT)
    tk.Button(bottomFrame, text="Down", fg="red", command=goDown).pack()
    
    wn.mainloop()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多