如何使用 'getch' 作为在 'tkinter' 中移动对象的输入?
How can I use 'getch' as input for moving an object in 'tkinter'?
我正在尝试使用 python 制作 dodger 的复制品。在我的代码中,我使用 tkinter
创建了一个 window。我尝试使用 getch()
作为输入箭头键值的方式来使主角移动。这是我的代码:
from tkinter import *
from msvcrt import getch
import time
class Window(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.master = master
self.initWindow()
def initWindow(self):
self.master.title('Dodger')
self.pack(fill=BOTH, expand=1)
self.master.geometry('600x800')
self.master.config(bg='black')
menu = Menu(self.master)
self.master.config(menu=menu)
def clientExit():
exit()
file = Menu(menu)
file.add_command(label='Exit', command=clientExit)
file.add_command(label='Start', command=self.game)
menu.add_cascade(label='File', menu=file)
def game(self):
canvas = Canvas(self.master, width='600', height='800')
canvas.pack()
canvas.create_rectangle(0, 0, 600, 800, fill='black', outline='black')
character = canvas.create_rectangle(270, 730, 330, 760, fill='blue', outline='red')
left = 75
right = 77
time.sleep(10)
while True:
if ord(getch()) == left:
canvas.move(character, -5, 0)
canvas.update()
elif ord(getch()) == right:
canvas.move(character, 5, 0)
canvas.update()
root = Tk()
app = Window(root)
app.mainloop()
如您所见,在def game(self)
函数中,我创建了一个矩形作为角色。然后我使用 getch()
来比较键盘输入;按 right/left 箭头键将分别移动角色。但是,这在 window 中不起作用:我的 window 冻结并显示 "not responding"。我被迫关闭 window,因此我不知道是我的代码不工作还是我的电脑很烂。将其复制并粘贴到您的编辑器中,如果可能的话,请告诉我如何解决这个问题。
顺便说一句,当你加载window,点击文件,然后开始。
我修改了你的代码以更好地遵循 PEP8 并通过删除 sleep()
方法并添加 2 个 methods
来控制左右移动来更正 game()
方法。
通过确保我们的 Canvas 是一个 class 属性并且角色是一个 class 属性,我们可以从 class 中的任何方法与它们交互。
我把所有东西都变成了一个 class 属性,我认为应该是一个属性。
已更新以包含最大左侧和最大右侧。
import tkinter as tk
class Window(tk.Frame):
def __init__(self, master=None):
tk.Frame.__init__(self, master)
self.master.title('Dodger')
self.master.geometry('600x800')
self.master.config(bg='black')
menu = tk.Menu(self.master)
file = tk.Menu(menu)
file.add_command(label='Exit', command=exit)
file.add_command(label='Start', command=self.game)
menu.add_cascade(label='File', menu=file)
self.master.config(menu=menu)
self.canvas = None
self.character = None
self.master.bind("<Left>", self.left_key)
self.master.bind("<Right>", self.right_key)
def game(self):
self.canvas = tk.Canvas(self.master, width='600', height='800')
self.canvas.pack()
self.canvas.create_rectangle(0, 0, 600, 800, fill='black', outline='black')
self.character = self.canvas.create_rectangle(270, 730, 330, 760, fill='blue', outline='red')
def left_key(self, event):
cords = self.canvas.coords(self.character)
if cords[0] <= 5:
print("Max left")
else:
self.canvas.move(self.character, -5, 0)
def right_key(self, event):
cords = self.canvas.coords(self.character)
if cords[2] >= 595:
print("Max Right")
else:
self.canvas.move(self.character, 5, 0)
root = tk.Tk()
app = Window(root).pack(fill="both", expand=1)
root.mainloop()
我正在尝试使用 python 制作 dodger 的复制品。在我的代码中,我使用 tkinter
创建了一个 window。我尝试使用 getch()
作为输入箭头键值的方式来使主角移动。这是我的代码:
from tkinter import *
from msvcrt import getch
import time
class Window(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.master = master
self.initWindow()
def initWindow(self):
self.master.title('Dodger')
self.pack(fill=BOTH, expand=1)
self.master.geometry('600x800')
self.master.config(bg='black')
menu = Menu(self.master)
self.master.config(menu=menu)
def clientExit():
exit()
file = Menu(menu)
file.add_command(label='Exit', command=clientExit)
file.add_command(label='Start', command=self.game)
menu.add_cascade(label='File', menu=file)
def game(self):
canvas = Canvas(self.master, width='600', height='800')
canvas.pack()
canvas.create_rectangle(0, 0, 600, 800, fill='black', outline='black')
character = canvas.create_rectangle(270, 730, 330, 760, fill='blue', outline='red')
left = 75
right = 77
time.sleep(10)
while True:
if ord(getch()) == left:
canvas.move(character, -5, 0)
canvas.update()
elif ord(getch()) == right:
canvas.move(character, 5, 0)
canvas.update()
root = Tk()
app = Window(root)
app.mainloop()
如您所见,在def game(self)
函数中,我创建了一个矩形作为角色。然后我使用 getch()
来比较键盘输入;按 right/left 箭头键将分别移动角色。但是,这在 window 中不起作用:我的 window 冻结并显示 "not responding"。我被迫关闭 window,因此我不知道是我的代码不工作还是我的电脑很烂。将其复制并粘贴到您的编辑器中,如果可能的话,请告诉我如何解决这个问题。
顺便说一句,当你加载window,点击文件,然后开始。
我修改了你的代码以更好地遵循 PEP8 并通过删除 sleep()
方法并添加 2 个 methods
来控制左右移动来更正 game()
方法。
通过确保我们的 Canvas 是一个 class 属性并且角色是一个 class 属性,我们可以从 class 中的任何方法与它们交互。
我把所有东西都变成了一个 class 属性,我认为应该是一个属性。
已更新以包含最大左侧和最大右侧。
import tkinter as tk
class Window(tk.Frame):
def __init__(self, master=None):
tk.Frame.__init__(self, master)
self.master.title('Dodger')
self.master.geometry('600x800')
self.master.config(bg='black')
menu = tk.Menu(self.master)
file = tk.Menu(menu)
file.add_command(label='Exit', command=exit)
file.add_command(label='Start', command=self.game)
menu.add_cascade(label='File', menu=file)
self.master.config(menu=menu)
self.canvas = None
self.character = None
self.master.bind("<Left>", self.left_key)
self.master.bind("<Right>", self.right_key)
def game(self):
self.canvas = tk.Canvas(self.master, width='600', height='800')
self.canvas.pack()
self.canvas.create_rectangle(0, 0, 600, 800, fill='black', outline='black')
self.character = self.canvas.create_rectangle(270, 730, 330, 760, fill='blue', outline='red')
def left_key(self, event):
cords = self.canvas.coords(self.character)
if cords[0] <= 5:
print("Max left")
else:
self.canvas.move(self.character, -5, 0)
def right_key(self, event):
cords = self.canvas.coords(self.character)
if cords[2] >= 595:
print("Max Right")
else:
self.canvas.move(self.character, 5, 0)
root = tk.Tk()
app = Window(root).pack(fill="both", expand=1)
root.mainloop()