Я не знаю, почему этот простой кусок кода Python не работает - PullRequest
0 голосов
/ 03 февраля 2019

Моя идея в этом коде - запустить приложение с Tkinter, которое «загорается» на семисегментном дисплее в зависимости от того, какое число я нажимаю на клавиатуре.

import tkinter as tk
import keyboard
import time
from PIL import ImageTk, Image

def main():
    window = tk.Tk()
    window.title("AutoSegment")
    window.geometry("459x767")
    path=r"C:\Users\The Man Himself\Desktop\SSG\welcome.jpg"
    img = ImageTk.PhotoImage(Image.open(path))
    panel = tk.Label(window, image = img).pack(side = "bottom", fill = "both", expand = "yes")
    listener()
    tk.mainloop()

def set(name):
    path=r"C:\Users\The Man Himself\Desktop\SSG\%s.jpg" %name
    img = ImageTk.PhotoImage(Image.open(path))
    panel = tk.Label(window, image = img).pack(side = "bottom", fill = "both", expand = "yes")
    listener()
    tk.mainloop()

def listener():
    while True:
        try:
            if keyboard.is_pressed('1'):
                set("1")
                break
            elif keyboard.is_pressed('2'):
                set("2")
                break
            elif keyboard.is_pressed('3'):
                set("3")
                break
            elif keyboard.is_pressed('4'):
                set("4")
                break
            elif keyboard.is_pressed('5'):
                set("5")
                break
            elif keyboard.is_pressed('6'):
                set("6")
                break
            elif keyboard.is_pressed('7'):
                set("7")
                break
            elif keyboard.is_pressed('8'):
                set("8")
                break
            elif keyboard.is_pressed('9'):
                set("9")
                break
            elif keyboard.is_pressed('0'):
                set("0")
                break
        except:
            set("error")

main()

1 Ответ

0 голосов
/ 03 февраля 2019

Я не работал с модулем keyboard, но я могу показать вам, как работать без него.

Пара вещей;Окно создается внутри функции, что означает, что имя window является локальным для этой функции.Вместо этого создайте окно в глобальной области видимости.Также функция set() является встроенной функцией, и если вы переопределите ее, вы не сможете получить доступ к встроенной функции.Я назвал это set_display() вместо этого.

Поскольку вы измените изображение в panel, лучше создать его в глобальном пространстве имен.Кроме того, чтобы иметь возможность изменить его, вы должны сохранить ссылку, т.е. дать ему имя panel, а затем упаковать ее.В противном случае имя panel будет указывать на возвращаемое значение из pack(), равное = None.

При последующем изменении изображения в метке в функции set_display() необходимо также сохранить ссылку на изображение в метке, явно прокомментированной в моем примере кода.

Затем я использую bind(), чтобы подключить клавиатуру, что является стандартным методом в виджетах tkinter.После этого я запускаю mainloop(), который ждет, пока клавиша не будет нажата, а затем вызывает keypress().

import tkinter as tk
from PIL import ImageTk, Image

def set_display(name):
    path = r"C:\Users\The Man Himself\Desktop\SSG\%s.jpg" %name
    img = ImageTk.PhotoImage(Image.open(path))
    panel.config(image=img) # Load new image into label
    panel.image = img       # Save reference to image

def keypress(event):
    if event.char == '':    # Shift, ctrl etc, returns empty char
        set_display('error')
    elif event.char in '1234567890':    # Hook all numbers
        set_display(event.char)
    else:
        set_display('error')

window = tk.Tk()
window.title("AutoSegment")
window.geometry("459x767")

# Create Seven Segment Display label in global namespace
path = r"C:\Users\The Man Himself\Desktop\SSG\welcome.jpg"
img = ImageTk.PhotoImage(Image.open(path))
panel = tk.Label(window, image=img)
panel.pack(side="bottom", fill="both", expand="yes")

window.bind('<KeyPress>', keypress)
window.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...