簡體   English   中英

帶有tkinter的Python 3.4中調用單個函數的多個事件的錯誤

[英]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參數應該是一個可執行文件,因此,如果您希望多個按鈕使用相同的功能但稍有不同,可以查看lambdaspartials

基於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM