2016-03-28 16 views
0

私はTkinterを学ぶという点でPythonに少し新しく、GUIをコード化する能力があります。その結果、私はPython 2.7.3を使ってGUI上で簡単なJPEG画像を撮っています。私は "自己"という言葉を使っていろいろな解決策を見てきました。目的を理解していると思います。残念ながら、それは今私のコードがどのようにレイアウトされているかということです。ここに私のコードは、現在設定されている方法です。TkinterキャンバスにJPEG画像を追加する

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) 

だから、あなたは私がプレイヤークラスを作成し、creat_random_player方法でJPEGへのパスを設定していることがわかります。キャンバスを作成してイメージを作成してみると、何も表示されません。私はいくつかのことを試してきましたが、ここで何人かが来て、「自己」を渡す必要があると言いますが、これをどうやって行うのかは分かりません。私は少しの損失を抱えているため、何人もの人が提供できることを感謝します。

また、私はこのコードがおそらくは不合理だと知っていますが、それは最初のパスです。コードを作成し続けると、私はそれを掃除しますが、これは今のところです。すべてを変更する以外には、ソリューションをコーディングする他の方法がない限り、コード構造に関するコメントは控えてください。

+0

ローカル変数は、関数が終了するとガベージコレクションされ、その後にtkImageは存在しません。 www.effbot.org/pyfaq/why-do-my-tkinter-images-not-appear.htmを参照してください。あなたのケースでは、canvasインスタンスcanvas.image = ImageTk.PhotoImageなどに追加できます。 –

+0

[tkinter canvas image not duplicating](http://stackoverflow.com/questions/26479728/tkinter-canvas-image) –

+0

例えば、 '[tkinter]表示キャンバスイメージ 'のSOを検索すると、以前の複数の質問が同じ回答で表示されます。 –

答えて

1

イメージは、pythonのガベージコレクタによってガベージコレクションされています。イメージへの参照を保存する必要があります。

ここ

は、あなたのコード内の参照を保存するための他の方法があります
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 

(s)はあなたのplayerImgがあなたの行で

を表示するために取得するためのソリューションです。これはちょうど私が見た最も速いものです。

+0

このソリューションはうまくいきましたので、私はそれを問題の解決策としてマークします。私はその応答に感謝します。あなたは私のコードで参照を保存する他の方法があると言いましたが、私があなたが精緻化できるかどうか不思議でしたか?私はコードを最適化しようとしています。より良い方法を知っていることが、今後の世界を進歩させるだろうということです。 –

関連する問題