更新時(shí)間:2017年07月28日 10:53:39 作者:羅兵 這篇文章主要介紹了Python tkinter模塊彈出窗口及傳值回到主窗口操作,結(jié)合實(shí)例形式分析了Python使用tkinter模塊實(shí)現(xiàn)的彈出窗口及參數(shù)傳遞相關(guān)操作技巧,需要的朋友可以參考下 本文實(shí)例講述了Python tkinter模塊彈出窗口及傳值回到主窗口操作,。分享給大家供大家參考,具體如下: 有些時(shí)候,,我們需要使用彈出窗口,,對(duì)程序的運(yùn)行參數(shù)進(jìn)行設(shè)置。有兩種選擇 一,、標(biāo)準(zhǔn)窗口 如果只對(duì)一個(gè)參數(shù)進(jìn)行設(shè)置(或者說(shuō)從彈出窗口取回一個(gè)值),,那么可以使用simpledialog ,導(dǎo)入方法: 1 | from tkinter.simpledialog import askstring, askinteger, askfloat
|
完整例子 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import tkinter as tk
from tkinter.simpledialog import askstring, askinteger, askfloat
# 接收一個(gè)整數(shù)
def print_integer():
res = askinteger( "Spam" , "Egg count" , initialvalue = 12 * 12 )
print (res)
# 接收一個(gè)浮點(diǎn)數(shù)
def print_float():
res = askfloat( "Spam" , "Egg weight\n(in tons)" , minvalue = 1 , maxvalue = 100 )
print (res)
# 接收一個(gè)字符串
def print_string():
res = askstring( "Spam" , "Egg label" )
print (res)
root = tk.Tk()
tk.Button(root, text = '取一個(gè)字符串' , command = print_string).pack()
tk.Button(root, text = '取一個(gè)整數(shù)' , command = print_integer).pack()
tk.Button(root, text = '取一個(gè)浮點(diǎn)數(shù)' , command = print_float).pack()
root.mainloop()
|
二,、自定義窗口 如果要設(shè)置的參數(shù)個(gè)數(shù)超過(guò)兩個(gè),,那么tkinter提供的標(biāo)準(zhǔn)窗口就處理不了了。 這就需要自定義一個(gè)窗口,,那么問(wèn)題來(lái)了:怎樣將自定義窗口中的數(shù)據(jù)傳回主窗口? 百度查詢,,不外乎兩種方法:全局變量(global),、對(duì)象變量([],、{}等),都不是我想要的,。 然后,,去 stackoverflow 逛了一下,綜合了個(gè)問(wèn)題的答案,,得到兩個(gè)本人比較滿意的方案,。 一種是松耦合,另一種是緊耦合 1)松耦合 說(shuō)明: 主窗類,,繼承了 tk.Tk 彈窗類,,繼承了 tk.Toplevel 要點(diǎn): 彈窗,將多個(gè)數(shù)據(jù),,打包,,放入一個(gè)名為 username 的私有 list 對(duì)象,銷毀彈窗 主窗,,待彈窗運(yùn)行后,,通過(guò)wait_window 方法,取得彈窗的名為 username 私有變量 完整代碼: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | import tkinter as tk
'''松耦合'''
# 彈窗
class MyDialog(tk.Toplevel):
def __init__( self ):
super ().__init__()
self .title( '設(shè)置用戶信息' )
# 彈窗界面
self .setup_UI()
def setup_UI( self ):
# 第一行(兩列)
row1 = tk.Frame( self )
row1.pack(fill = "x" )
tk.Label(row1, text = '姓名:' , width = 8 ).pack(side = tk.LEFT)
self .name = tk.StringVar()
tk.Entry(row1, textvariable = self .name, width = 20 ).pack(side = tk.LEFT)
# 第二行
row2 = tk.Frame( self )
row2.pack(fill = "x" , ipadx = 1 , ipady = 1 )
tk.Label(row2, text = '年齡:' , width = 8 ).pack(side = tk.LEFT)
self .age = tk.IntVar()
tk.Entry(row2, textvariable = self .age, width = 20 ).pack(side = tk.LEFT)
# 第三行
row3 = tk.Frame( self )
row3.pack(fill = "x" )
tk.Button(row3, text = "取消" , command = self .cancel).pack(side = tk.RIGHT)
tk.Button(row3, text = "確定" , command = self .ok).pack(side = tk.RIGHT)
def ok( self ):
self .userinfo = [ self .name.get(), self .age.get()] # 設(shè)置數(shù)據(jù)
self .destroy() # 銷毀窗口
def cancel( self ):
self .userinfo = None # 空,!
self .destroy()
# 主窗
class MyApp(tk.Tk):
def __init__( self ):
super ().__init__()
#self.pack() # 若繼承 tk.Frame ,,此句必須有!
self .title( '用戶信息' )
# 程序參數(shù)/數(shù)據(jù)
self .name = '張三'
self .age = 30
# 程序界面
self .setupUI()
def setupUI( self ):
# 第一行(兩列)
row1 = tk.Frame( self )
row1.pack(fill = "x" )
tk.Label(row1, text = '姓名:' , width = 8 ).pack(side = tk.LEFT)
self .l1 = tk.Label(row1, text = self .name, width = 20 )
self .l1.pack(side = tk.LEFT)
# 第二行
row2 = tk.Frame( self )
row2.pack(fill = "x" )
tk.Label(row2, text = '年齡:' , width = 8 ).pack(side = tk.LEFT)
self .l2 = tk.Label(row2, text = self .age, width = 20 )
self .l2.pack(side = tk.LEFT)
# 第三行
row3 = tk.Frame( self )
row3.pack(fill = "x" )
tk.Button(row3, text = "設(shè)置" , command = self .setup_config).pack(side = tk.RIGHT)
# 設(shè)置參數(shù)
def setup_config( self ):
# 接收彈窗的數(shù)據(jù)
res = self .ask_userinfo()
#print(res)
if res is None : return
# 更改參數(shù)
self .name, self .age = res
# 更新界面
self .l1.config(text = self .name)
self .l2.config(text = self .age)
# 彈窗
def ask_userinfo( self ):
inputDialog = MyDialog()
self .wait_window(inputDialog) # 這一句很重要?。,。?/code>
return inputDialog.userinfo
if __name__ = = '__main__' :
app = MyApp()
app.mainloop()
|
2)緊耦合 說(shuō)明: 主窗類,,繼承了 tk.Tk 彈窗類,,繼承了 tk.Toplevel 要點(diǎn): 彈窗,顯式地保存父窗口,,顯式地修改父窗口數(shù)據(jù),,顯式地更新父窗口部件,最后銷毀彈窗 主窗,,待彈窗運(yùn)行后,,通過(guò)wait_window 方法,返回 None 完整代碼: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | import tkinter as tk
'''緊耦合'''
# 彈窗
class PopupDialog(tk.Toplevel):
def __init__( self , parent):
super ().__init__()
self .title( '設(shè)置用戶信息' )
self .parent = parent # 顯式地保留父窗口
# 第一行(兩列)
row1 = tk.Frame( self )
row1.pack(fill = "x" )
tk.Label(row1, text = '姓名:' , width = 8 ).pack(side = tk.LEFT)
self .name = tk.StringVar()
tk.Entry(row1, textvariable = self .name, width = 20 ).pack(side = tk.LEFT)
# 第二行
row2 = tk.Frame( self )
row2.pack(fill = "x" , ipadx = 1 , ipady = 1 )
tk.Label(row2, text = '年齡:' , width = 8 ).pack(side = tk.LEFT)
self .age = tk.IntVar()
tk.Entry(row2, textvariable = self .age, width = 20 ).pack(side = tk.LEFT)
# 第三行
row3 = tk.Frame( self )
row3.pack(fill = "x" )
tk.Button(row3, text = "取消" , command = self .cancel).pack(side = tk.RIGHT)
tk.Button(row3, text = "確定" , command = self .ok).pack(side = tk.RIGHT)
def ok( self ):
# 顯式地更改父窗口參數(shù)
self .parent.name = self .name.get()
self .parent.age = self .age.get()
# 顯式地更新父窗口界面
self .parent.l1.config(text = self .parent.name)
self .parent.l2.config(text = self .parent.age)
self .destroy() # 銷毀窗口
def cancel( self ):
self .destroy()
# 主窗
class MyApp(tk.Tk):
def __init__( self ):
super ().__init__()
# self.pack() # 若繼承 tk.Frame,,此句必須有?。?!
self .title( '用戶信息' )
# 程序參數(shù)
self .name = '張三'
self .age = 30
# 程序界面
self .setupUI()
def setupUI( self ):
# 第一行(兩列)
row1 = tk.Frame( self )
row1.pack(fill = "x" )
tk.Label(row1, text = '姓名:' , width = 8 ).pack(side = tk.LEFT)
self .l1 = tk.Label(row1, text = self .name, width = 20 )
self .l1.pack(side = tk.LEFT)
# 第二行
row2 = tk.Frame( self )
row2.pack(fill = "x" )
tk.Label(row2, text = '年齡:' , width = 8 ).pack(side = tk.LEFT)
self .l2 = tk.Label(row2, text = self .age, width = 20 )
self .l2.pack(side = tk.LEFT)
# 第三行
row3 = tk.Frame( self )
row3.pack(fill = "x" )
tk.Button(row3, text = "設(shè)置" , command = self .setup_config).pack(side = tk.RIGHT)
# 設(shè)置參數(shù)
def setup_config( self ):
pw = PopupDialog( self )
self .wait_window(pw) # 這一句很重要?。?!
return
if __name__ = = '__main__' :
app = MyApp()
app.mainloop()
|
效果圖 更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python編碼操作技巧總結(jié)》,、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》,、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門與進(jìn)階經(jīng)典教程》 希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助,。
|