我是一個Python3的新手,第一次嘗試tkinter,最近我回答了
這要求輸入。
前3個輸入行由callback_int驗證,它只允許int數字,而后2個輸入行使用callback_str,它允許浮點數如1.5或0.5和分數如1/7或5/7。
我的問題(抱歉花了這么長時間)是:
有沒有一種方法可以將函式引數傳遞給callback,比如callback(typez = str)。
這樣我就可以縮短我的代碼,只使用一個回呼函式,對我的int和string值采取不同的行動?如果我使用reg_int = mainwindow.register(callback_int(input,typez='popo'))我得到
line ...
if input.isdigit()。
AttributeError: 'function' object沒有屬性'isdigit'。
我猜問題出在:
reg_int = mainwindow.register(callback_int(input,typez=' popo') #AttributeError: 'function' object has no attribute 'isdigit'.
reg_str = mainwindow.register(callback_str('pipi')
但是沒有找到任何有用的東西,也許我的方法是在錯誤的方向上
。uj5u.com熱心網友回復:
這使用lambda陳述句將"str"或"int"傳遞給callback()中的typez引數,以便callback()知道input是什么型別。以下是基于我上面第一條評論的完整代碼:
import tkinter as tk
from tkinter import IntVar,StringVar
###############################################################################
def callback(input,typez=None) 。
if typez == "int":
if input.isdigit():
# print(input)。
return True
elif input == ""。
# print(input).
return True[/span
else:
print(input)
return False False
if typez == "str"/span>:
if len(input) > =1 and input[0] == '/'/span>:
return False: return False
if all([s. isdigit() or s =='/'/span> for s in input]) and input。 count('/') <= 1:
# print([s.isdigit() or s =='/' for s in input]).
# print(input)。
return True
elif all([s.isdigit() or s ==' 。 ' for s in input]) and input。 count('. ') <= 1:
# print([s.isdigit() or s =='.' for s in input]).
# print(input)。
return True
else:
print('no valid input : '/span>,input)
return False
def mainwindow()。
mainwindow = tk.Tk()
mainwindow.geometry('350x350')
tk.Label(mainwindow, text="在下面輸入引數").grid(row=1)
getN = IntVar()
geti0 = IntVar()
getr0 = IntVar()
getbeta = StringVar(mainwindow, value='0')
getgamma = StringVar(mainwindow, value='0')
tk.Label(mainwindow, text="N").grid(row=2)
tk.Label(mainwindow, text="i0") .grid(row=3)
tk.Label(mainwindow, text="r0") .grid(row=4)
tk.Label(mainwindow, text="beta").grid(row=5)
tk.Label(mainwindow, text="gamma"/span>).grid(row=6)
e1 = tk.Entry(mainwindow,textvariable = getN)
e1.grid(row=2, column=1)
e2 = tk.Entry(mainwindow,textvariable = geti0)
e2.grid(row=3, column=1)
e3 = tk.Entry(mainwindow,textvariable = getr0)
e3.grid(row=4, column=1)
e4 = tk.Entry(mainwindow,textvariable = getbeta)
e4.grid(row=5, column=1)
e5 = tk.Entry(mainwindow,textvariable = getgamma)
e5.grid(row=6, column=1)
reg_int = mainwindow.register(lambda input, typez="int" /span>: callback(input, typez=typez)
reg_str = mainwindow.register(lambda input, typez="str"/span>: callback(input, typez=typez)
e1.config(validate ="key", validatecommand =(reg_int, '%P'))
e2.config(validate ="key", validatecommand =(reg_int, '%P')
e3.config(validate ="key", validatecommand =(reg_int, '%P')
e4.config(validate ="key", validatecommand =(reg_str, '%P')
e5.config(validate ="key", validatecommand =(reg_str, '%P')
solve = tk.Button(mainwindow, text='solve!', command=lambda: [values()]).grid(row=7, column=1, sticky=tk.W, pady=4)
def values()。
readN = getN.get()
readi0 = geti0.get()
readr0 = getr0.get()
readbeta = eval(getbeta.get(),{"buildins"/span>: {}})
readgamma = eval(getgamma.get(), {"buildins": {})
intN = int(readN)
inti0 = int(readi0)
intr0 = int(readr0)
intbeta = float(readbeta)
intgamma = float(readgamma)
print(intN,'
',inti0,'
',intr0,'
',intbeta,'
',intgamma)
mainwindow.mainloop()
mainwindow()
uj5u.com熱心網友回復:
嗨,感謝那個洗掉了一個解釋得很好的答案的神秘發帖人(Bryan Oakley)。我能夠提供另一種方法來解決我的問題。以下是代碼:
import tkinter as tk
from tkinter import IntVar,StringVar
###############################################################################
def callback(input,typez=None) 。
if typez == "int":
if input.isdigit():
# print(input)。
return True
elif input == ""。
# print(input).
return True[/span
else:
print(input)
return False False
if typez == "str"/span>:
if len(input) > =1 and input[0] == '/'/span>:
return False: return False
if all([s. isdigit() or s =='/'/span> for s in input]) and input。 count('/') <= 1:
# print([s.isdigit() or s =='/' for s in input]).
# print(input)。
return True
elif all([s.isdigit() or s ==' 。 ' for s in input]) and input。 count('. ') <= 1:
# print([s.isdigit() or s =='.' for s in input]).
# print(input)。
return True
else:
print('no valid input : '/span>,input)
return False
def mainwindow()。
mainwindow = tk.Tk()
mainwindow.geometry('350x350')
tk.Label(mainwindow, text="在下面輸入引數").grid(row=1)
getN = IntVar()
geti0 = IntVar()
getr0 = IntVar()
getbeta = StringVar(mainwindow, value='0')
getgamma = StringVar(mainwindow, value='0')
tk.Label(mainwindow, text="N").grid(row=2)
tk.Label(mainwindow, text="i0") .grid(row=3)
tk.Label(mainwindow, text="r0") .grid(row=4)
tk.Label(mainwindow, text="beta").grid(row=5)
tk.Label(mainwindow, text="gamma"/span>).grid(row=6)
e1 = tk.Entry(mainwindow,textvariable = getN)
e1.grid(row=2, column=1)
e2 = tk.Entry(mainwindow,textvariable = geti0)
e2.grid(row=3, column=1)
e3 = tk.Entry(mainwindow,textvariable = getr0)
e3.grid(row=4, column=1)
e4 = tk.Entry(mainwindow,textvariable = getbeta)
e4.grid(row=5, column=1)
e5 = tk.Entry(mainwindow,textvariable = getgamma)
e5.grid(row=6, column=1)
reg_int = mainwindow.register(callback)
reg_str = mainwindow.register(callback)
e1.config(validate ="key", validatecommand =(reg_int, '%P', 'int')
e2.config(validate ="key", validatecommand =(reg_int, '%P', 'int')
e3.config(validate ="key", validatecommand =(reg_int, '%P', 'int')
e4.config(validate ="key", validatecommand =(reg_str, '%P', 'str')
e5.config(validate ="key", validatecommand =(reg_str, '%P', 'str'))
solve = tk.Button(mainwindow, text='solve!', command=lambda: [values()]).grid(row=7, column=1, sticky=tk.W, pady=4)
def values()。
readN = getN.get()
readi0 = geti0.get()
readr0 = getr0.get()
readbeta = eval(getbeta.get(),{"buildins"/span>: {}})
readgamma = eval(getgamma.get(), {"buildins": {})
intN = int(readN)
inti0 = int(readi0)
intr0 = int(readr0)
intbeta = float(readbeta)
intgamma = float(readgamma)
print(intN,'
',inti0,'
',intr0,'
',intbeta,'
',intgamma)
mainwindow.mainloop()
mainwindow()
它沒有使用lambda,只是像https://anzeljg.github.io/rin2/book2/2405/docs/tkinter/entry-validation.html中那樣傳遞引數 :
為了設定這個回呼,你將在Entry建構式中使用這兩個選項:
為了設定這個回呼,你將使用這兩個選項。
self. w = Entry(self, validate='all',validatecommand=(okayCommand, '%d', '%i', '%S'), ... here my extra args ...)
比如:
e1.config(validate ="key", validatecomand =(reg_int, '%P', 'int')
e2.config(validate ="key", validatecommand =(reg_int, '%P', 'int')
e3.config(validate ="key", validatecommand =(reg_int, '%P', 'int')
e4.config(validate ="key", validatecommand =(reg_str, '%P', 'str')
e5.config(validate ="key", validatecommand =(reg_str, '%P', 'str'))
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/311789.html
標籤:
