Привязки клавиатуры Tkinter

Я работаю над интерфейсом, используя Tkinter и виджет холста, и до сих пор находил ответы на вопросы, которые у меня возникали из других вопросов и опубликованных ответов, но я в тупике на этом.

У меня есть несколько привязок клавиатуры в классе, где создаются мои элементы GUI, и все они отлично работают при запуске программы. Бинды выглядят примерно так:

self.canvas.get_tk_widget().bind("<Control-o>",self.flash_open)

и находятся внутри функции __init __класса. Со вчерашнего дня я инициализировал этот класс для запуска программы, затем подождал, пока пользователь выберет пункт «Открыть» в меню, которое затем открыло (среди прочего )tkmessagebox

self.specfilename =askopenfilename(filetypes=[("spec", "")],initialdir= self.pathname)

С этим именем файла я могу получить требуемые имена переменных из определенного типа файла (, не имеющего отношения к проблеме ). Сегодня я модифицировал функцию __init __для вызова функции открытия при запуске программы. Поскольку ничего нельзя сделать, пока этот файл не будет открыт, имеет смысл открыть его в первую очередь. После выбора файла и закрытия Tkmessagebox корневое окно становится активным, но ни одна из привязок клавиатуры не работает. Мои функции по-прежнему работают с назначенными им меню/кнопками, но не с привязками. Пробовал привязывать ярлыки к руту, результат тот же.и теперь я думаю, что это может быть проблема с приказом, который я им звоню

def __init__(self):
   ...
    self.openfile() #calls the tkmessagebox
    self.root.mainloop() #starts gui

На самом деле я сталкивался с этой проблемой раньше, когда экземпляр верхнего уровня ()был закрыт/уничтожен и отключил привязки родительского окна. Нет никакого сообщения об ошибке, о котором можно было бы говорить, привязки просто ничего не делают. Я также должен упомянуть, что пытался снова сфокусироваться на корневом окне, используя

self.openfile()
self.root.mainloop()
self.root.focus_set()

Раньше я обходил это, используя функции wm _remove ()и wm _deiconify (), чтобы просто скрыть дочернее окно, а затем закрыть его после завершения программы. Однако это исправление немного сложнее применить в этом случае. Если кто-то может пролить свет на причину проблемы, я был бы признателен.

Изменить:

Я написал исполняемый сегмент кода, чтобы показать, в чем именно заключается моя проблема.

import os
from tkFileDialog import askopenfilename
from Tkinter import *


class Start:
    def __init__(self):

        self.root = Tk()
        self.root.title('Binding Troubles')
        menubar = Menu(self.root)
        #add items and their commands to the menubar
        filemenu = Menu(menubar, tearoff=0)
        filemenu.add_command(label="Do work", command=self.do_work)
        filemenu.add_command(label="Open File",command=self.openfile)
        menubar.add_cascade(label="File", menu=filemenu)
        #bind control-o to perform the do work function
        self.root.bind("<Control-o>",self.flash_do_work)
        self.root.bind("<Control-O>",self.flash_do_work)
        #add the menubar to the GUI
        self.root.config(menu=menubar) 
        #initially open a tkdialog to open a file
        self.openfile()#comment out this line to make the bind work 
        self.root.focus()#also tried self.root.focus_set()
        self.root.mainloop()
    def flash_do_work(self,event):
        #indirect tie to the do_work() function, I'm don't know a 
        #proper way to make functions handle calls from both events and non-events
        self.do_work()
    def openfile(self):
        #gets current path
        self.pathname = os.getcwd()
        #Requests filename using a tkdialog
        self.filename =askopenfilename(initialdir= self.pathname)
        print self.filename
    def do_work(self):
        #placeholder for actual function; shows whether the bind is working or not
        print "work"

Start()

Привязка будет работать, если self.openfile ()удалить из __init __и использовать только из меню

Другое редактирование :Я снова обновил пример, предоставив пункт меню для запуска функции openfile (). Я заметил, что если openfile ()вызывается в __init __, бинд работать не будет. Но если в следующий раз снова вызвать функцию openfile, на этот раз вручную из меню, привязка снова начнет работать. Не совсем уверен, что взять из этого. Кроме того, мои извинения за то, что пост получился таким длинным.

7
задан pmacd 2 August 2012 в 17:01
поделиться