Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » проблема с горячими клавишами. event [RSS Feed]

#1 Фев. 4, 2014 20:32:12

zlodiak
От: Россия
Зарегистрирован: 2014-01-19
Сообщения: 159
Репутация: +  0  -
Профиль   Адрес электронной почты  

проблема с горячими клавишами. event

помогите пожалуйста поправить скрипт с минимальными телодвижениями, если это возможно

написал в процедурном стиле небольшой текстовый редактор. захотел добавить горячие клавиши(ctrl + key). но при вызове соответствующей функции

root.bind_class(root, '<Control-Key-o>', fileOpen)
обязательно нужно передавать аргумент event. из-за него у меня вся программа ломается. то есть при изменении объявления с такого
def fileOpen():
на такое
def fileOpen(event):
программа перестаёт работать

вот полный код программы(извиняюсь за многабукв):
import tkinter
def fileNew(parent, title = 'New file(nonamed)'):
    global WorkArea
    try:
        WorkArea
    except:    
        WorkArea = tkinter.Text(parent)
        root.title(title)
        WorkArea.pack(expand = 'yes', fill = 'both')
    else:
        #tkinter.messagebox.showerror.iconbitmap('error')
        tkinter.messagebox.showerror('Error', 'File is open. Close this file for new operation')
    
def fileOpen():
    global fileOpened, openFile
    
    try:
        WorkArea 
    except:
        openFile = tkinter.filedialog.askopenfilename(title = 'Open textPad file', filetypes=[("textPad files", "*.tpd")])
        fileNew(root, openFile)
        try:
            fileOpened = open(openFile, 'rt')
        except:
            tkinter.messagebox.showerror('Error', 'Open file error')
        else:
            while True:
                line = fileOpened.readline()
                if len(line) == 0:
                    break
                WorkArea.insert(tkinter.END, line)
            fileOpened.close()
    else:
        try:
            fileOpened
        except:
            tkinter.messagebox.showerror('Error', 'Close opened file')
        else:
            tkinter.messagebox.showerror('Error', 'Close or save nonamed file')
def fileSave():
    global fileOpened, openFile, WorkArea
    try:
        WorkArea
    except:
        tkinter.messagebox.showerror('Error', 'File not open')
    else:
        try:
            fileOpened
        except:
            fileSaveAs()
        else:
            fileOpened.close() 
            text = WorkArea.get('0.0', tkinter.END)
            fileOpened = open(openFile, 'wt')
            fileOpened.write(text)
            fileOpened.close()
    
def fileSaveAs():
    global fileOpened, openFile, WorkArea
    try:
        WorkArea
    except:
        tkinter.messagebox.showerror('Error', 'File not open')
    else:
        text = WorkArea.get('0.0', tkinter.END)
        save = tkinter.filedialog.asksaveasfilename(title = 'Save textPad file', filetypes=[("textPad files", "*.tpd")], defaultextension = '.tpd')
        file = open(save, 'wt')
        file.write(text)
        file.close()
        root.title(save)
def fileClose():
    global fileOpened, WorkArea, openFile
    WorkArea.destroy()
    root.title('textPad editor')
    del WorkArea    
    try:
        openFile
    except:
        pass
    else:
        del openFile    
    try:
        fileOpened
    except:
        pass
    else:
        del fileOpened
def makeMenu(parent):
    top = tkinter.Menu(parent) 
    parent.config(menu = top)                           
    file = tkinter.Menu(top, tearoff = False)
    file.add_command(label = 'New...', command = lambda: fileNew(parent), accelerator = 'ctrl + n')
    file.add_command(label = 'Open...', command = fileOpen, accelerator = 'ctrl + o')
    file.add_command(label = 'Save...', command = fileSave, accelerator = 'ctrl + s')
    file.add_command(label = 'Save as...', command = fileSaveAs)
    file.add_command(label = 'Close...', command = fileClose, accelerator = 'ctrl + c')
    file.add_command(label = 'Quit', command = parent.quit, accelerator = 'ctrl + q')
    top.add_cascade(label = 'File', menu = file)
    
root = tkinter.Tk()
root.geometry("1000x500")
root.bind_class(root, '<Control-Key-o>', fileOpen)
try:
    root.iconbitmap('images/ico.ico')
except:
    print('No ico file found')
makeMenu(root)
root.mainloop()

Отредактировано zlodiak (Фев. 4, 2014 20:34:12)

Офлайн

#2 Фев. 5, 2014 09:36:19

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

проблема с горячими клавишами. event

1. bind_class использовать не обязательно.
2. event передавать не обязательно. Можно так:

root.bind("<Ctrl+KeyPress+o>", lambda event: bind_function())

Таким образом вы можете душить передачу event.

Но вообще правильнее будет переписать функцию обработчик, чтобы она принимала произвольное число аргументов.

Будут вопросы - пишите…

Офлайн

  • Начало
  • » GUI
  • » проблема с горячими клавишами. event[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version