根据我的阅读,ImageTk
应该将枕头图像转换为Tkinter可以显示的格式。 (实际上,当我不这样做时,Tkinter会失败并出现错误。)但是,当我在Windows计算机上运行该程序时,Tkinter框会显示它没有响应,也不会显示图像。
from PIL import Image, ImageDraw
class Block:
def __init__(self, x=30, y=10, speed=None, size=2.5):
self.x = x
self.y = y
self.size = size # radius
if speed is None:
speed = self.size * 2
self.speed = speed
def draw(self, image):
width, height = image.size
drawer = ImageDraw.Draw(image)
drawer.rectangle(((self.x - self.size, height - (self.y - self.size)), (self.x + self.size, height - (self.y + self.size))), fill="white")
class BallDodge():
def __init__(self):
self.width = 400
self.height = 300
self.main_player = Block(self.width // 2)
self.balls = []
self.frame = 0
self.frames_between_balls = 20
self.frames_since_last_ball = self.frames_between_balls
self.input_function = self.get_human_input
self.states = []
@property
def state(self):
ans = Image.new('RGBA', (self.width, self.height), "black")
self.main_player.draw(ans)
return ans
def get_human_input(self, *args, **kwargs):
try:
ans = int(input("1, 2, 3, or 4:"))
if ans > 4:
raise ValueError("Can't be greater than 4")
elif ans < 1:
raise ValueError("Can't be less than 1")
if ans == 1:
return [1, 0]
elif ans == 2:
return [0, 0]
elif ans == 3:
return [0, 1]
elif ans == 4:
return [1, 1]
else:
raise ValueError("Somehow it's not one of the specified numbers. You are magical.")
except Exception as e:
print("Invalid input")
print(e)
return self.get_human_input()
def step(self):
inpt = self.input_function(self.state)
directions = [-1, 1]
for i in range(2):
self.main_player.x += directions[i] * inpt[i]
self.states.append(self.state)
if __name__ == "__main__":
game = BallDodge()
import tkinter as tk
from PIL import ImageTk, Image
root = tk.Tk()
my_image = ImageTk.PhotoImage(game.state)
game.state.show()
while True:
panel = tk.Label(image = ImageTk.PhotoImage(game.state), master = root)
panel.pack()
# panel = Label(root, image = ImageTk.PhotoImage(game.state))
# panel.pack(side = "bottom", fill = "both", expand = "yes")
root.update_idletasks()
root.update()
game.step()
我注意到的事情:
如果我执行game.state.show()
,它将很好地打开图像,因此肯定有一个图像。
如果我确实按下数字键之一前进到下一帧,则Tkinter窗口的高度将增加一倍,但仍然不显示任何内容。
如何获得一个循环,以便可以在Tkinter窗口中显示枕头图像,获取用户输入,然后显示新图像?
答案 0 :(得分:0)
使用以下循环对我有用。 (这很杂乱,可以改进,但是可以。)
[^ء-ي0-9ﭐ-﷿ﹰ-ﻼ]