Сравнение событий keybind tkinter - PullRequest
0 голосов
/ 21 апреля 2020

Я пытаюсь написать простой интерфейс, который становится синим всякий раз, когда пользователь выбирает его, и белым, когда он не выбран мышью. Я не уверен, почему мое решение не работает. (Функция запускается правильно). я верю, что оператор if ошибочен.

def ColorChange(event):
    if event.type == "Enter":
        FirstEntry.configure(bg="lightblue")
    elif event.type == "Leave":
        FirstEntry.configure(bg="white")
    else:
        pass

#Entry Boxes
FirstEntry=tk.Entry(interface,textvariable=inputedData,font=labelFont)
FirstEntry.grid(row=2,column=2,columnspan=2)
FirstEntry.bind("<Enter>",ColorChange)
FirstEntry.bind("<Leave>",ColorChange)

Полная программа

import tkinter as tk
from tkinter.font import Font

root = tk.Tk()
root.title("Basic Interface")
interface=tk.Frame(root)
interface.configure(bg='white')
interface.grid(row=0, column=0,sticky='news')
interface.tkraise()
#Tkinter Variables
inputedData= tk.StringVar()
outputData= tk.StringVar()
#Define Functions
def Process(event):
    getData=inputedData.get()
    print(getData)
    outputData.set(getData)

    print(event.time)
    print(event.char)
    print(event.type)
    print(event.widget)
    print(event.x)
    print(event.y)

def ColorChange(event):
    if event.type == "Enter":
        FirstEntry.configure(bg="lightblue")
    elif event.type == "Leave":
        FirstEntry.configure(bg="white")
    else:
        pass



#Fonts
titleFont = Font(family="Arial", size="48")
labelFont = Font(family="Arial", size="24")
buttonFont = Font(family="Arial",size = "20")
#Labels
titleLabel=tk.Label(interface,text="Interface Title",fg="black",font=titleFont,bg='white')
titleLabel.grid(row=1,column=1,columnspan=5)
inputLabel=tk.Label(interface,text="Input Data: ",fg="black",font=labelFont,bg='white')
inputLabel.grid(row=2,column=1)
oLabel=tk.Label(interface,text="Output Data: ",fg="black",font=labelFont,bg='white')
oLabel.grid(row=3,column=1)
outputLabel=tk.Label(interface,textvariable=outputData,fg="black",font=labelFont,bg='white')
outputLabel.grid(row=3,column=2)
#Entry Boxes
FirstEntry=tk.Entry(interface,textvariable=inputedData,font=labelFont)
FirstEntry.grid(row=2,column=2,columnspan=2)
FirstEntry.bind("<Enter>",ColorChange)
FirstEntry.bind("<Leave>",ColorChange)

#Buttons
processButton=tk.Button(interface,text="Process",fg="black",font=buttonFont,bg='white')
processButton.bind("<Leave>",Process)
processButton.grid(row=4,column=2)
root.mainloop()

Для тех, кто запрашивает воспроизводимый пример, здесь это

Ответы [ 2 ]

2 голосов
/ 21 апреля 2020

event.type возвращает tkinter.EventType, а не строку напрямую,

похоже на <EventType.Enter: '7'>.

Есть два способа заставить его работать:

Измените ключ EventType на string:

def ColorChange(event):
    if str(event.type) == "Enter":
        FirstEntry.configure(bg="lightblue")
    elif str(event.type) == "Leave":
        FirstEntry.configure(bg="white")
    else:
        pass

Или используйте tkinter.EventType в качестве значения:

def ColorChange(event):
    if event.type == tk.EventType.Enter:
        FirstEntry.configure(bg="lightblue")
    elif event.type == tk.EventType.Leave:
        FirstEntry.configure(bg="white")
    else:
        pass

Любой из них будет работать:

import tkinter as tk

def ColorChange(event):
    if str(event.type) == "Enter":
        FirstEntry.configure(bg="lightblue")
    elif str(event.type) == "Leave":
        FirstEntry.configure(bg="white")
    else:
        pass

interface = tk.Tk()

inputedData = tk.StringVar()

#Entry Boxes
FirstEntry=tk.Entry(interface,textvariable=inputedData) # ,font=labelFont)
FirstEntry.grid(row=2,column=2,columnspan=2)
FirstEntry.bind("<Enter>",ColorChange)
FirstEntry.bind("<Leave>",ColorChange)

interface.mainloop()

enter image description here

1 голос
/ 21 апреля 2020

Очевидно, что тип события.type <enum 'EventType'> не является прямой строкой, поэтому равенство не будет выполнено. Вместо этого попробуйте:

if str(event.type) == 'Enter':

или

if int(event.type) == 7:
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...