Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用';getch';作为在';tkinter';?_Python_Tkinter_Getch - Fatal编程技术网

Python 如何使用';getch';作为在';tkinter';?

Python 如何使用';getch';作为在';tkinter';?,python,tkinter,getch,Python,Tkinter,Getch,我正在尝试使用python制作dodger的副本。在我的代码中,我使用tkinter创建了一个窗口。我尝试使用getch()作为输入箭头键值的一种方式,以使主要字符移动。这是我的密码: from tkinter import * from msvcrt import getch import time class Window(Frame): def __init__(self, master=None): Frame.__init__(self, master)

我正在尝试使用python制作dodger的副本。在我的代码中,我使用
tkinter
创建了一个窗口。我尝试使用
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()
来比较键盘输入;按向右/向左箭头键将分别移动字符。但是,这在窗口中不起作用:我的窗口冻结,并显示“无响应”。我被迫关闭窗口,因此我不知道我的代码是否正常工作,或者我的计算机是否很糟糕。复制并粘贴到你的编辑器,请让我知道如何修复这个问题,如果可能的话


顺便说一句,当您加载窗口时,单击文件,然后开始。

我修改了您的代码以更好地遵循PEP8,并通过删除
sleep()
方法并添加两个控制左右移动的
方法来更正
game()
方法

通过确保画布是类属性,角色是类属性,我们可以从类中的任何方法与它们交互

我把所有的东西都变成了一个类属性,我认为它应该是一个

更新为包括最大左和最大右

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()
将tkinter作为tk导入
类窗口(tk.Frame):
def uuu init uuu(self,master=None):
tk.Frame.\uuuuu init\uuuuuuu(自,主)
self.master.title('Dodger'))
自主几何体('600x800')
self.master.config(bg='black')
menu=tk.menu(self.master)
file=tk.Menu(菜单)
file.add_命令(label='Exit',command=Exit)
file.add_命令(label='Start',command=self.game)
menu.add_级联(label='File',menu=File)
self.master.config(菜单=菜单)
self.canvas=None
self.character=None
self.master.bind(“,self.left_键)
self.master.bind(“,self.right\u键)
def游戏(自我):
self.canvas=tk.canvas(self.master,宽度='600',高度='800')
self.canvas.pack()
canvas.create_矩形(0,0600800,fill='black',outline='black')
self.character=self.canvas.create_矩形(270730330760,fill='blue',outline='red')
def左键(自身,事件):
cords=self.canvas.coords(self.character)
如果跳线[0]=595:
打印(“最大右侧”)
其他:
self.canvas.move(self.character,5,0)
root=tk.tk()
app=Window(root).pack(fill=“both”,expand=1)
root.mainloop()

为什么不使用
bind()
?我不确定所有的
getch()
都能做什么,但是通过
bind()
可以向基于按键的函数发送更新。参数是什么,以及如何使用
bind()
?我可能会做类似
root.bind(“,某些函数)
。也就是说,您也在使用tkinter中的
sleep()
方法,您不能这样做
sleep()
将冻结tk实例,您应该将代码转换为使用
after()
。我通过执行以下操作实现了
bind()
self.master.bind(“”,canvas.move(character,-5,0)
,但这没有任何作用。什么
getch()
是这样的,当按下一个键时它返回一个字节值;
ord()
将其转换为一个整数。因此,如果ord(getch())==左:bind…
有效?您没有完全正确地使用bind。请查看我提供的答案,看看您能做些什么。就像按钮中的命令一样,您不能以您尝试的方式传递参数。您可以对希望传递的每个参数使用lambda或逗号。
bind()如何操作
使函数对键盘输入做出反应?命令“''是否意味着按下左箭头键?您从不使用
self.left
self.right
。您应该从答案中删除这些内容。您也不需要执行
self.canvas.update()
在绑定函数中。更新会在tkinter下次检查事件时自动进行。否则,这是一个很好的答案。哼哼。谢谢Bryan,我没有意识到self。left/right根本没有被使用。我想它们在那里是有原因的,所以我把它们留在了。@flameboi如果我的答案解决了您的问题,请选择chec我的答案旁边的k框。这是用来表示您的发卡机构已被解决。顺便问一下,我有没有办法对其进行限制,以便
字符
不会超出边界(600 x 800)?