2017-01-28 59 views
1

儘管Tkinter的派生自Tcl/Tk,但它不如Tcl/Tk完整。 Tcl/Tk綁定函數具有tkinter不具有的某些屬性(例如%d返回事件https://www.tcl.tk/man/tcl8.4/TkCmd/bind.htm#M24的詳細信息字段)。
Tcl/Tk腳本可以被python中的「eval」函數使用,但我不知道如何在Tcl/Tk腳本中聲明一個tkinter小部件。如何在Python中的Tkinter的小部件上使用Tcl/Tk綁定函數?

那麼我怎樣才能使用這個功能及其在Tkinter小部件上的屬性?

+2

,你是什麼意思,當你點擊按鈕通過「這個功能」?你是指'eval'?你問如何在綁定中使用'%d'? –

+0

我的意思是「如何在綁定中使用%d」 – Iman

回答

3

如果您問如何創建一個使用「數據」字段的綁定(即:%d替換),您將不得不調用一些tcl代碼來實現此目的。這需要兩個步驟:創建一個調用python函數的tcl命令,並使用tcl將一個事件綁定到該函數。首先,我們來創建一個可以創建一個事件並設置「data」字段的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註冊函數。然後,只需通過tcl接口調用bind即可設置綁定。

然後,第一步是註冊回調。我們已經創建了這個函數,我們只需要創建一個調用這個函數的tcl函數。幸運的是,tkinter使用register命令爲我們提供了一種方法。您可以使用這樣的:

cmd = root.register(callback) 

這需要一個Python函數(callback在這種情況下),並創建一個Tcl命令將調用該函數。 register返回存儲在名爲cmd(名稱無關)的變量中的tcl命令的名稱

接下來,我們需要通過Tcl設置一個綁定來調用此命令。如果我們在實際的TCL腳本這樣做,則命令會是這個樣子(其中表示根窗口「」):

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

蟒蛇相當於是這樣的:

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

公告在call的參數和tcl參數之間存在1:1的對應關係。方便地,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

相關問題