【问题标题】:How to call Turtle window from a GUI如何从 GUI 调用 Turtle 窗口
【发布时间】:2020-11-22 16:06:34
【问题描述】:

我正在尝试从 GUI 打开一个 Turtle 窗口,以通过单击鼠标选择图像上的位置。然后将 x 和 y 坐标作为 GUI 的输入返回。

这是一个最小的工作示例:

from tkinter import *
from tkinter import font as tkFont
import turtle

xclick = 0
yclick = 0

def callback3():
    getcoordinates()


def getcoordinates():
    screen = turtle.Screen()
    screen.setup(400, 400)
    screen.bgpic("stunden.gif")
    screen.onscreenclick(modifyglobalvariables)

    
def modifyglobalvariables(rawx,rawy):
    global xclick
    global yclick
    xclick = int(rawx//1)
    yclick = int(rawy//1)
    print(xclick)
    print(yclick)
    turtle.bye()


root = Tk()

helv30 = tkFont.Font(family='Helvetica', size=30)

button1 = Button(root, text = "1", width=3, font=helv30, borderwidth=0, command=callback3)
button1.grid(row=0, column=0, padx=5, pady=0)

root.mainloop()

然后出现错误image "pyimage2" doesn't exist。我发现它与Tk 的两个实例有关,因为有根和乌龟窗口,我应该用Toplevel() 解决它。然而,经过数小时的研究和尝试和错误,我仍然无法提出正确的解决方案来使我的代码正常工作。非常感谢任何帮助。

【问题讨论】:

  • 请注意您错误地标记了您的问题,它应该是“tkinter”而不是“tinker”。无论如何,我的建议是不要使用turtle 来执行此操作。充其量它会很尴尬,因为该模块使用 tkinter 它的实现 - 特别是在这种情况下,因为您可以非常喜欢直接通过 tkinter 本身做同样的事情而没有太多困难。
  • 感谢您的建议马蒂诺。你能给我一个提示如何直接用 tkinter 做吗?

标签: python tkinter python-turtle


【解决方案1】:

这是直接在 tkinter 中实现它的方法——因此不需要 turtle 模块——正如我之前在(现已删除的)评论中建议的那样:

from tkinter import *
from tkinter import font as tkFont

CLOCK_IMAGE_PATH = 'clock.png'
xclick, yclick = 0, 0

def callback3():
    window = Toplevel()
    window.title("Stunden")
    img = PhotoImage(file=CLOCK_IMAGE_PATH)
    img_width, img_height = img.width(), img.height()
    window.minsize(width=img_width, height=img_height)
    canvas = Canvas(window, width=img_width, height=img_height)
    canvas.pack()
    canvas.image = img  # Keep reference to avoid image being garbage collected.
    canvas.create_image(0, 0, anchor='nw', image=img)
    canvas.bind("<Button-1>", get_coordinates)  # Set up event-handler callback.

def get_coordinates(event):
    global xclick, yclick
    xclick = int(event.x // 1)
    yclick = int(event.y // 1)
    print(f'xclick={xclick}, yclick={yclick}')

root = Tk()
helv30 = tkFont.Font(family='Helvetica', size=30)
button1 = Button(root, text="1", width=3, font=helv30, borderwidth=0, command=callback3)
button1.grid(row=0, column=0, padx=5, pady=0)
root.mainloop()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-09
    • 2016-06-02
    • 2021-12-05
    • 2011-09-08
    • 2018-06-14
    • 1970-01-01
    • 2018-07-06
    • 2010-10-24
    相关资源
    最近更新 更多