Как я могу использовать 'getch' в качестве входных данных для перемещения объекта в 'tkinter'? - PullRequest
0 голосов
/ 28 июня 2018

Я пытаюсь сделать точную копию Доджера, используя python. В моем коде я сделал окно, используя 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() для сравнения ввода с клавиатуры; нажатие клавиши со стрелкой вправо / влево переместит символ соответственно. Тем не менее, это не работает в окне: мое окно зависает и говорит «не отвечает». Я вынужден закрыть окно, поэтому я не знаю, работает ли мой код или мой компьютер не работает. Скопируйте и вставьте это в свой редактор и, пожалуйста, дайте мне знать, как я могу это исправить, если это возможно.

Кстати, когда вы загружаете окно, щелкните файл, затем запустите.

1 Ответ

0 голосов
/ 28 июня 2018

Я изменил ваш код, чтобы он немного лучше соответствовал PEP8, и исправил метод game(), удалив метод sleep() и добавив еще 2 methods для управления движением влево и вправо.

Убедившись, что наш Canvas является атрибутом класса, а символ - атрибутом класса, мы можем взаимодействовать с ними из любого метода в классе.

Я превратил все в атрибут класса, который, как мне казалось, должен быть один.

Обновлено для включения максимального левого и максимального правого.

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()
...