[英]Errors with Multiple Events Calling a Single Function in Python 3.4 w/ tkinter
我試圖在綁定事件中使用參數。 我正在將python 3.4與tkinter 8 +一起使用(不確定atm)。 我的問題是:
1)當我在按鈕綁定之后聲明n1時,代碼顯示n1未定義(duh)
2)當我在按鈕綁定之前聲明n1時,該函數在繪制按鈕時被調用,而從不被單擊(以下所示版本), 從不調用,這是所需的功能(允許用戶將邏輯符號嵌入到其中)否則可以使用ASCII字體自由輸入)。
3)第一個按鈕演示在沒有參數的函數中,它知道誰是超出范圍的窗口小部件“ n1”; 但是,如果我要添加單個參數(以傳遞希望顯示的文本),則代碼將無法編譯,錯誤為“ n1”未定義。
4)我意識到我可以為每個綁定創建一個唯一的函數並跳過參數,但是我痴迷於單個函數的想法。
5)我看過示例,並編譯並運行了它們,它們使用的“事件”自變量在綁定/定義中未明確引用。 盡管出於某種原因,這和變體“ * args”並不會導致上述“ n1”超出范圍,但當我嘗試以這種方式編寫自己的代碼時,“ * args”為空或“事件”聲明為undefined等(希望嘗試使用event.widget來檢測哪個按鈕稱為函數)。 我只是沒有將頭緒圍繞這些示例,而無法成功地應用於我自己的代碼。
本質上,我希望有多個事件調用相同的函數來為每個事件執行相同的任務,並且根據哪個小部件進行了較小的區別,如下面的代碼所示。 也許當我有一個已知的解決方案(多個功能與單個功能)時,我正在轉動方向盤,但是我非常想擴展我的技能,特別是在訪問事件屬性的領域。 謝謝您的幫助!!
from tkinter import *
from tkinter import ttk
root = Tk()
def noArg():
n1.insert('insert','I know who n1 is')
def addSymbol(t,s):
t.insert('insert',s)
p = ttk.Panedwindow(root, orient=VERTICAL)
#-------------------------------------------------------
#second pane will contain the work area via notebook containing text widgets
#-------------------------------------------------------
n = ttk.Notebook(p)
n1 = Text(n,width=50,height=10);
n.add(n1, text='Argument')
n1['state']='normal'
#-------------------------------------------------------
#first pane will contain buttons to modify the workspace
#-------------------------------------------------------
bWidth = '36p'
f = ttk.Frame(p)
f['width']='504p'
f['height']='18p'
#button to add noArg binding
b = ttk.Button(f, text='hah!', command=noArg)
b['width']=bWidth
b.grid(row=0,column=0)
#button to add conditional symbol
b = ttk.Button(f, text=u'\u2e27', command=addSymbol(n1,u'\u2e27'))
b['width']=bWidth
b.grid(row=0,column=1)
#button to add biconditional symbol
b = ttk.Button(f, text=u'\u2261', command=addSymbol(n1,u'\u2261'))
b['width']=bWidth
b.grid(row=0,column=2)
p.add(f)
p.add(n)
p.grid()
root.mainloop()
這是一個常見的Tk錯誤。 在行中
b = ttk.Button(f, text=u'\u2e27', command=addSymbol(n1,u'\u2e27'))
和
b = ttk.Button(f, text=u'\u2261', command=addSymbol(n1,u'\u2261'))
您沒有將功能分配給command
,而是將功能的輸出分配給了command
。 command參數應該是一個可執行文件,因此,如果您希望多個按鈕使用相同的功能但稍有不同,可以查看lambdas或partials 。
基於lambda的快速解決方案是將上述行更改為:
b = ttk.Button(f, text=u'\u2e27', command=lambda:addSymbol(n1,u'\u2e27'))
和
b = ttk.Button(f, text=u'\u2261', command=lambda:addSymbol(n1,u'\u2261'))
基於局部的快速修復將是:
from functools import partial
b = ttk.Button(f, text=u'\u2e27', command=partial(addSymbol(n1,u'\u2e27')))
b = ttk.Button(f, text=u'\u2261', command=partial(addSymbol(n1,u'\u2261')))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.