【问题标题】:Tkinter making image variable into a classTkinter 将图像变量变成一个类
【发布时间】:2021-02-25 05:48:02
【问题描述】:

我最近正在使用tkinter 制作游戏,它是Canvas 小部件,但在尝试移动图像时遇到了问题。我将canvas.create_image 设置为一个名为character 的变量,但注意到它把它变成了一个对象。这会导致问题,因为当我尝试使用canvas.move(character) 时,它会返回“character 未定义”。完整代码如下:

from tkinter import *
from PIL import ImageTk, Image
import pygame
import threading
import time


gamestate= 'title'
waiting = False

#window init
root = Tk()
WIDTH=1280
HEIGHT=720
canvas = Canvas(root, width=WIDTH, height=HEIGHT, bg='black')
canvas.pack(expand=1, fill=BOTH)
logo = PhotoImage(file='Ghost clipart.png')
root.iconphoto(False, logo)

#setting up all the images
title_image = PhotoImage(file='title.png')
board_image = Image.open('board.png')
done_board = board_image.resize((1920,1080), Image.ANTIALIAS)
board_image = ImageTk.PhotoImage(done_board)
character_image = ImageTk.PhotoImage(file='first_run_left.png')

#display the title screen
def title_screen():
    title = canvas.create_image(WIDTH/2,HEIGHT/2, anchor=CENTER, image=title_image)

#define the events after clicking play
def play():
    canvas.delete("all")
    board = canvas.create_image(WIDTH/2 + 100,HEIGHT/2 - 360, anchor=CENTER, image=board_image)
    character = canvas.create_image(556,304,anchor=CENTER,image=character_image)

#testing for what should happen the the mouse button is clicked
def click(event):
    if gamestate == 'title':
        print(event.x, event.y)
        if event.x > 475 and event.x < 804 and event.y > 213 and event.y < 337:
            play()
        elif event.x > 475 and event.x < 804 and event.y > 404 and event.y < 527:
            print("skin")

def up(event):
    canvas.move(character,0,10)


root.bind('<Button-1>', click)
root.bind('<Up>', up)
#audio module
def test_loop():
    while True:
        pygame.mixer.init()
        pygame.mixer.music.load("nokia-ringtone-arabic.mp3")
        pygame.mixer.music.play()
        time.sleep(23)

thread = threading.Thread(target=test_loop)
thread.daemon = True 
thread.start()



title_screen()
root.mainloop()

【问题讨论】:

  • 请考虑修改您在此问题中发布的代码。我们不需要 5 个不同的图像文件(未提供)或pygame 混音器来回答有关图像的问题;此外,变量character 未定义,代码无法运行!这是一个great resource,可以帮助您开始。祝你的代码好运!

标签: python tkinter canvas


【解决方案1】:

这是一个简单的脚本,它使用箭头键在画布上移动图像。请注意,变量img(在您的情况下为character)必须可以从作用于它的函数中访问,因此它的范围必须在这些函数之上。

您可以以此为起点来解决您的问题。

使用的图片:

import tkinter as tk


def up(event):
    canvas.move(img, 0, -10)

def down(event):
    canvas.move(img, 0, 10)

def left(event):
     canvas.move(img, -10, 0)

def right(event):
    canvas.move(img, 10, 0)

width = 500
height = 500

window = tk.Tk()
window.title("Moving image")
canvas = tk.Canvas(window, width=500, height=500)
canvas.pack()
my_image = tk.PhotoImage(file="pix.png")
img = canvas.create_image(260, 125, anchor=tk.NW, image=my_image)

window.bind("<Up>", up)
window.bind("<Down>", down)
window.bind("<Left>", left)
window.bind("<Right>", right)

window.mainloop()

【讨论】:

    【解决方案2】:

    由于characterplay()函数内部的一个局部变量,它不能在up()函数内部访问。

    但是您可以使用create_image()tags 选项:

    def play():
        ...
        canvas.create_image(556,304,anchor=CENTER,image=character_image, tags='character')
    

    然后您可以使用相同的标签引用该图像项:

    def up(event):
        canvas.move('character',0,-10) # use tag 'character'
    

    【讨论】:

    • 感谢您的回复,我意识到我没有全局化 character 变量,但在我的情况下,它不是变量,而是类中的对象,我不知道为什么我无法改变它。但我认为tags 无论如何都会起作用,所以这不再是问题了。编辑 - tags 功能已经工作,程序现在按预期运行,谢谢。
    • create_image() 返回一个整数 ID,而不是类中的对象。
    • visual studio 将character 标记为对象,并将其变为青色。
    • doc。你也可以运行print(type(character)),它会返回&lt;class 'int'&gt;
    【解决方案3】:

    create_image 不会将任何东西变成对象。它只是返回一个整数标识符。原始对象不变。 character 未定义,因为它是一个局部变量,因此仅在创建它的方法中可见。

    【讨论】:

      猜你喜欢
      • 2013-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-23
      • 2011-04-01
      相关资源
      最近更新 更多