将 JPEG 图像添加到 Tkinter Canvas
Adding JPEG Image to Tkinter Canvas
在学习 Tkinter 及其编写 GUI 的能力方面,我对 python 有点陌生。因此,我正在尝试使用 python 2.7.3 在 GUI 上制作一个简单的 JPEG 图像。我已经看到许多使用 "self" 词的不同解决方案,我想我理解其目的。不幸的是,现在我的代码就是这样布局的,因为我现在只是在编码我想到的东西。这是我的代码当前的设置方式:
from Tkinter import *
from random import randint
from PIL import Image, ImageTk
# Global root item for using TKinter
root = Tk()
PLAYER_IMAGE_PATH = 'Path_to_image'
# Player class
class Player:
playerHp = 0
playerAtk = 0
playerDef = 0
playerImg = ''
playerPositionX = 0
playerPositionY = 0
def __init__(self, hitpoints, attackPower, defensePower, pathToImage, positionX, positionY):
self.playerHp = hitpoints
self.playerAtk = attackPower
self.playerDef = defensePower
self.playerImg = pathToImage
self.playerPositionX = positionX
self.playerPositionY = positionY
# Method for building the frame.
def build_frame(screenHeight, screenWidth):
canvas = Canvas(root, bg = 'blue', height = screenHeight, width = screenWidth)
canvas.pack()
player = create_random_player()
display_player_image(canvas, player)
#display_player_stats(frame, player)
bind_all_keys(player)
# Key binding events.
def bind_all_keys(player):
root.bind('<Left>', lambda event, arg=player: left_key(event, arg))
root.bind('<Right>', lambda event, arg=player: right_key(event, arg))
root.bind('<Up>', lambda event, arg=player: up_key(event, arg))
root.bind('<Down>', lambda event, arg=player: down_key(event, arg))
def left_key(event, player):
print "Player coordinates(X,Y): " + str(player.playerPositionX) + "," + str(player.playerPositionY)
player.playerPositionX -= 1
def right_key(event, player):
print "Player coordinates(X,Y): " + str(player.playerPositionX) + "," + str(player.playerPositionY)
player.playerPositionX += 1
def up_key(event, player):
print "Player coordinates(X,Y): " + str(player.playerPositionX) + "," + str(player.playerPositionY)
player.playerPositionY -= 1
def down_key(event, player):
print "Player coordinates(X,Y): " + str(player.playerPositionX) + "," + str(player.playerPositionY)
player.playerPositionY += 1
# End key binding events.
def create_random_player():
return Player(randint(0,9), randint(0,9), randint(0,9), PLAYER_IMAGE_PATH, 0, 0)
def display_player_image(canvas, player):
canvas.create_rectangle(50, 50, 250, 100, fill = "green")
tkImage = ImageTk.PhotoImage(Image.open(player.playerImg))
canvas.create_image(100, 100, image = tkImage, anchor = NE)
def display_player_stats(frame, player):
hitPoints = Text(frame, height = 1)
hitPoints.insert(INSERT, "HP: " + str(player.playerHp))
hitPoints.pack()
attackPower = Text(frame, height = 1)
attackPower.insert(INSERT, "Attack: " + str(player.playerAtk))
attackPower.pack()
defensePower = Text(frame, height = 1)
defensePower.insert(INSERT, "Defense: " + str(player.playerDef))
defensePower.pack()
xPos = Text(frame, height = 1)
xPos.insert(INSERT, "X Pos: " + str(player.playerPositionX))
xPos.pack()
yPos = Text(frame, height = 1)
yPos.insert(INSERT, "Y Pos: " + str(player.playerPositionY))
yPos.pack()
# Main method. Calculates height at 70% then sets width to same height to create square on screen.
def main(root):
height = root.winfo_screenheight() * 0.7
width = height
build_frame(screenHeight = height, screenWidth = width)
root.mainloop()
# Entry method.
if __name__ == "__main__":
main(root)
因此,您可以看到我创建了一个播放器 class 并在 creat_random_player 方法中设置了 JPEG 的路径。我创建了我的 canvas 并继续尝试创建我的图像,但没有出现。我已经尝试了很多事情,我知道有些人会来这里说我需要通过 "self",但我不确定如何按原样进行。我很感激人们可以提供的任何意见,因为我有点不知所措。
另外,我知道这段代码可能很草率,但这是第一次通过,我会在继续编写代码时清理它,但现在就是这样。请不要对代码结构发表评论,除非除了更改所有内容之外别无他法来编写解决方案。
您的图像正在被 python 的垃圾收集器收集。您需要保存对图像的引用。
这是让您的 playerImg 显示的解决方案
在线
def display_player_image(canvas, player):
canvas.create_rectangle(50, 50, 250, 100)
tkImage = ImageTk.PhotoImage(Image.open(player.playerImg))
canvas.create_image(100, 100, image = tkImage, anchor = NE)
player.playerImg = tkImage #Reference
还有其他方法可以在您的代码中保存引用。这是我看到的最快的
在学习 Tkinter 及其编写 GUI 的能力方面,我对 python 有点陌生。因此,我正在尝试使用 python 2.7.3 在 GUI 上制作一个简单的 JPEG 图像。我已经看到许多使用 "self" 词的不同解决方案,我想我理解其目的。不幸的是,现在我的代码就是这样布局的,因为我现在只是在编码我想到的东西。这是我的代码当前的设置方式:
from Tkinter import *
from random import randint
from PIL import Image, ImageTk
# Global root item for using TKinter
root = Tk()
PLAYER_IMAGE_PATH = 'Path_to_image'
# Player class
class Player:
playerHp = 0
playerAtk = 0
playerDef = 0
playerImg = ''
playerPositionX = 0
playerPositionY = 0
def __init__(self, hitpoints, attackPower, defensePower, pathToImage, positionX, positionY):
self.playerHp = hitpoints
self.playerAtk = attackPower
self.playerDef = defensePower
self.playerImg = pathToImage
self.playerPositionX = positionX
self.playerPositionY = positionY
# Method for building the frame.
def build_frame(screenHeight, screenWidth):
canvas = Canvas(root, bg = 'blue', height = screenHeight, width = screenWidth)
canvas.pack()
player = create_random_player()
display_player_image(canvas, player)
#display_player_stats(frame, player)
bind_all_keys(player)
# Key binding events.
def bind_all_keys(player):
root.bind('<Left>', lambda event, arg=player: left_key(event, arg))
root.bind('<Right>', lambda event, arg=player: right_key(event, arg))
root.bind('<Up>', lambda event, arg=player: up_key(event, arg))
root.bind('<Down>', lambda event, arg=player: down_key(event, arg))
def left_key(event, player):
print "Player coordinates(X,Y): " + str(player.playerPositionX) + "," + str(player.playerPositionY)
player.playerPositionX -= 1
def right_key(event, player):
print "Player coordinates(X,Y): " + str(player.playerPositionX) + "," + str(player.playerPositionY)
player.playerPositionX += 1
def up_key(event, player):
print "Player coordinates(X,Y): " + str(player.playerPositionX) + "," + str(player.playerPositionY)
player.playerPositionY -= 1
def down_key(event, player):
print "Player coordinates(X,Y): " + str(player.playerPositionX) + "," + str(player.playerPositionY)
player.playerPositionY += 1
# End key binding events.
def create_random_player():
return Player(randint(0,9), randint(0,9), randint(0,9), PLAYER_IMAGE_PATH, 0, 0)
def display_player_image(canvas, player):
canvas.create_rectangle(50, 50, 250, 100, fill = "green")
tkImage = ImageTk.PhotoImage(Image.open(player.playerImg))
canvas.create_image(100, 100, image = tkImage, anchor = NE)
def display_player_stats(frame, player):
hitPoints = Text(frame, height = 1)
hitPoints.insert(INSERT, "HP: " + str(player.playerHp))
hitPoints.pack()
attackPower = Text(frame, height = 1)
attackPower.insert(INSERT, "Attack: " + str(player.playerAtk))
attackPower.pack()
defensePower = Text(frame, height = 1)
defensePower.insert(INSERT, "Defense: " + str(player.playerDef))
defensePower.pack()
xPos = Text(frame, height = 1)
xPos.insert(INSERT, "X Pos: " + str(player.playerPositionX))
xPos.pack()
yPos = Text(frame, height = 1)
yPos.insert(INSERT, "Y Pos: " + str(player.playerPositionY))
yPos.pack()
# Main method. Calculates height at 70% then sets width to same height to create square on screen.
def main(root):
height = root.winfo_screenheight() * 0.7
width = height
build_frame(screenHeight = height, screenWidth = width)
root.mainloop()
# Entry method.
if __name__ == "__main__":
main(root)
因此,您可以看到我创建了一个播放器 class 并在 creat_random_player 方法中设置了 JPEG 的路径。我创建了我的 canvas 并继续尝试创建我的图像,但没有出现。我已经尝试了很多事情,我知道有些人会来这里说我需要通过 "self",但我不确定如何按原样进行。我很感激人们可以提供的任何意见,因为我有点不知所措。
另外,我知道这段代码可能很草率,但这是第一次通过,我会在继续编写代码时清理它,但现在就是这样。请不要对代码结构发表评论,除非除了更改所有内容之外别无他法来编写解决方案。
您的图像正在被 python 的垃圾收集器收集。您需要保存对图像的引用。
这是让您的 playerImg 显示的解决方案
在线
def display_player_image(canvas, player):
canvas.create_rectangle(50, 50, 250, 100)
tkImage = ImageTk.PhotoImage(Image.open(player.playerImg))
canvas.create_image(100, 100, image = tkImage, anchor = NE)
player.playerImg = tkImage #Reference
还有其他方法可以在您的代码中保存引用。这是我看到的最快的