2017-01-28 6 views
1

Хотя Tkinter получен из Tcl/Tk, но он не такой полный, как Tcl/Tk. Функция связывания Tcl/Tk имеет некоторые атрибуты, которые tkinter не делает (например,% d, который возвращает поле детали из события https://www.tcl.tk/man/tcl8.4/TkCmd/bind.htm#M24).
Скрипты Tcl/Tk могут использоваться функцией eval в python, но я не знаю, как объявить виджет tkinter в скрипте Tcl/Tk.Как использовать функцию привязки Tcl/Tk на виджетах Tkinter в Python?

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

+2

Когда вы говорите, «как я могу использовать эту функцию», то, что вы имеете в виду по "этой функции"? Вы имеете в виду 'eval'? Вы спрашиваете, как использовать '% d' в привязке? –

+0

Я имею в виду «как использовать% d в привязке» – Iman

ответ

3

Если вы спрашиваете, как создать привязку, которая использует поле данных (то есть: %d), вам нужно будет вызвать некоторый код tcl, чтобы это произошло. Это требует двух шагов: создайте команду tcl, которая вызывает функцию python, и используйте tcl для привязки события к этой функции.

Во-первых, давайте создадим программу python, которая может создать событие и установить поле «данные» (предполагается, что существует глобальная переменная с именем root, которую мы создадим позже). Когда эта функция вызывается, она генерирует пользовательское событие с полем данных, заполненным строкой.

def create_custom_event(): 
    root.event_generate("<<Custom>>", data="Hello, world") 

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

import tkinter as tk 
root = tk.Tk() 
button = tk.Button(root, text="click me", command=create_custom_event) 
button.pack(side="top", padx=20, pady=20) 
root.mainloop() 

Далее нам нужно создать функцию, которая вызывается, когда событие генерируется. Мы планируем установить поле data, поэтому эта функция должна принять одно значение, которое является значением замены %d.

def callback(detail): 
    print("detail: %s" % detail) 

Потому что вы хотите использовать замену %d мы должны создать привязку с помощью Tcl. Однако tcl не знает о наших функциях python автоматически, поэтому нам нужно зарегистрировать функцию с помощью tcl. Тогда просто нужно позвонить bind через интерфейс tcl, чтобы настроить привязку.

Первым шагом, таким образом, является регистрация обратного вызова. Мы уже создали эту функцию, нам просто нужно создать функцию tcl, которая вызывает эту функцию. К счастью, tkinter дает нам способ сделать это с помощью команды register. Вы можете использовать его как это:

cmd = root.register(callback) 

Это берет функцию питона (callback в данном случае), и создает TCL команду, которая будет вызывать эту функцию. register возвращает имя этой команды tcl, которую мы храним в переменной с именем cmd (имя не имеет значения)

Далее нам нужно настроить привязку через Tcl для вызова этой команды. Если бы мы делали это в реальной TCL скрипт, команда будет выглядеть примерно так (где представляет корневое окно «»):

bind . <<Custom>> {callback %d} 

Питон эквивалент это:

root.tk.call("bind", root, "<<Custom>>", cmd + " %d") 

Примечание что существует соответствие 1: 1 между аргументом call и аргументом tcl. Удобно, строковое представление по умолчанию для виджета tkinter - это внутреннее имя tcl, поэтому мы можем напрямую использовать виджет в вызове (хотя, по-видимому, мы должны использовать str(root)).

Собираем все вместе дает нам это, который печатает «деталь: Привет, мир» при нажатии на кнопку:

import tkinter as tk 

def callback(detail): 
    print("detail: %s" % detail) 

def create_custom_event(): 
    root.event_generate("<<Custom>>", data="Hello, world") 

root = tk.Tk() 

button = tk.Button(root, text="click me", command=create_custom_event) 
button.pack(side="top", padx=20, pady=20) 

cmd = root.register(callback) 
root.tk.call("bind", root, "<<Custom>>", cmd + " %d") 

root.mainloop() 
+0

Это полностью помогло мне. Спасибо. – Iman

 Смежные вопросы

  • Нет связанных вопросов^_^