Привязка клавиш клавиатуры к Tkinter кнопка


Я конкретно спрашиваю о привязке клавиш клавиатуры на кнопки в GUI. Изначально я планировал привязать клавиши к себе на кнопку в GUI, но это казалось невозможным, и, возможно, неумно после того, как я рассмотрел позже.

Это правильные (подходящие для Python) способ привязать клавишу кнопку и GUI?

## start.py
print 'start'

#from tkinter import *
from Tkinter import *
import os
from PIL import ImageTk, Image

class MyClass:
    '''This is my class.'''

    imgpath = '/Users/user/Dropbox/Camera Uploads'
    imgfile = 'susshi.jpg'
    #imgfilepath = os.path.join(self.imgpath, self.imgfile)
    imgfilepath = os.path.join(imgpath, imgfile)

    def __init__(self,master):
        print 'in __init__'

        # Create and load a frame into the tk (tkinter) window.
        frame = Frame(master)
        frame.pack()

        # Create and load two buttons in to the above-created frame.
        self.button = Button(frame, text="QUIT", fg="red", command=quit)
        self.button.pack(side=LEFT)
        self.slogan = Button(frame, text="Hello", command = self.f)
        self.slogan.pack(side=RIGHT)

        # Bind a key to each button from above.
        master.bind('q', quit)
        master.bind('f', self.f)

        # Open the image, resize it...
        self.image = Image.open(self.imgfilepath)
        self.image.thumbnail((600,600))
        # Make a tkinter-friendly image object ...
        self.display_image = ImageTk.PhotoImage(self.image)
        # Make a tkinter canvas, plug in the image, and pack the canvas.
        self.canvas = Canvas(master, bg='red')
        self.canvas.create_image(0,0, image=self.display_image, anchor="nw")
        self.canvas.pack(fill=BOTH, expand=1)
        ### FIXME: Set canvas focus!

    def f(self, event=None):
        print 'in f()'
        return 'hello world'

    def get_image_list(self):
        pass

    def next_image(self):
        pass

    def previous_image(self):
        pass

    def load_image(self):
        #stub
        pass

    def update_image(self):
        pass

root = Tk()
abc = MyClass(root)
root.mainloop()

print 'abc has been defined'
print '"abc.f()" returns "%s"' % abc.f()
#print str(abc.f)
#print repr(abc.f)

print 'end'

Целью проекта является сделать простой просмотрщик изображений на Python, с помощью кнопок в GUI для базовых навигационных функций и клавиш, назначенных теми же функциями.



Комментарии
2 ответа

ТЛ;ДР: да, привязка к клавиатуре и кнопку одну и ту же функцию-правильное решение.

Как привязать клавишу к кнопку tkinter

Есть два способа, чтобы разделить функции между bind нажатие на command кнопки.

Метод 1: Используйте необязательный параметр событие

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

Поскольку параметр не используется, Вы можете добавлять знак подчеркивания (_event) для предотвращения предупреждений.

    self.button = Button(frame, text="Hello", command=self.func)
master.bind('f', self.func)

def func(self, _event=None):
print("Hello, world")

Полный Пример:

# from tkinter import Button, Frame, Tk  # Python 3
from Tkinter import Button, Frame, Tk # Python 2

class MyClass:
def __init__(self, master):
frame = Frame(master)
frame.pack()

self.button = Button(frame, text="Hello", command=self.func)
self.button.pack(side='left')

master.bind('f', self.func)

def func(self, _event=None):
print("Hello, world")

root = Tk()
abc = MyClass(root)
root.mainloop()

Способ 2: Использование лямбда-выражений

Если параметр не используется, Вы можете отказаться от него путем привязки ключа к лямбда-функция.

    self.button = Button(frame, text="Hello", command=self.func)
master.bind('f', lambda event: self.func())

def func(self):
print("Hello, world")

Полный Пример:

# from tkinter import Button, Frame, Tk  # Python 3
from Tkinter import Button, Frame, Tk # Python 2

class MyClass:
def __init__(self, master):
frame = Frame(master)
frame.pack()

self.button = Button(frame, text="Hello", command=self.func)
self.button.pack(side='left')

master.bind('f', lambda event: self.func())

def func(self):
print("Hello, world!")

root = Tk()
abc = MyClass(root)
root.mainloop()

(См. Как сделать bind и команду делать то же самое в tkinter?)


Разное советы

Избегайте использования импорта подстановки

Вы должны стараться быть явной, когда вы импортировать в Python.

Да

from Tkinter import Tk, Button, Frame

Да

import Tkinter as tk

Нет

from Tkinter import *

(См. Почему “импорт *” плохо?)

Переключиться на Python 3

Как coal_ ответ уже упоминалось, разработка на Python 2 это планируется завершить в 2020 году. Для обеспечения постоянной поддержки, вы должны переключиться на Python 3 или позже.

Использовать строки при упаковке константы

Это больше личные предпочтения, чем правило, но я обычно стараюсь использовать строки при упаковке в tkinter. Это означает, что вы не должны импортировать столько вещей.

Да

self.button.pack(side="left")

Нет

self.button.pack(side=LEFT)

2
ответ дан 1 мая 2018 в 03:05 Источник Поделиться


Это правильное(, подходящие для Python) способ привязать клавишу кнопку и GUI?

Конечно. Мне трудно судить, что именно вы подразумеваете под "правильной", но она работает, и я не вижу каких-либо серьезных возражений с таким подходом. Привязки обратного вызова для кнопки и звонит button.focus_set() работает так же хорошо, но ваш подход имеет больше смысла. Подумайте об этом: есть ли обратного вызова применяется только к кнопке? По крайней мере, в случае с курением обратного вызова, нет, неважно, что виджет имеет фокус, нажав 'Q', то следует выйти из приложения.

Некоторые другие замечания:


  1. Используя подстановочный импорта (from <module> import *) Не рекомендуется по ряду причин. Например, используя подстановочные импорта может привести к конфликтам, если два символа с одинаковым именем, которые определены в разных пространствах имен, импортируются в глобальное пространство имен. Во-вторых, для других разработчиков, нет никакого способа, чтобы быстро говори, где был определен объект.

  2. Пеп-8 предлагает сортировку import высказывания по алфавиту.

  3. Если у вас нет веских причин, чтобы использовать Python 2, переключиться на Python 3! Версия 2.7 будет поддерживаться только до 2020 года (см. Пеп-373).

0
ответ дан 10 апреля 2018 в 10:04 Источник Поделиться