Я не работал с модулем 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()