Python tkinter模塊彈出窗口及傳值回到主窗口操作詳解
本文實(shí)例講述了Python tkinter模塊彈出窗口及傳值回到主窗口操作。分享給大家供大家參考,具體如下:
有些時候,我們需要使用彈出窗口,對程序的運(yùn)行參數(shù)進(jìn)行設(shè)置。有兩種選擇
一、標(biāo)準(zhǔn)窗口
如果只對一個參數(shù)進(jìn)行設(shè)置(或者說從彈出窗口取回一個值),那么可以使用simpledialog
,導(dǎo)入方法:
from tkinter.simpledialog import askstring, askinteger, askfloat
完整例子
import tkinter as tk from tkinter.simpledialog import askstring, askinteger, askfloat # 接收一個整數(shù) def print_integer(): res = askinteger("Spam", "Egg count", initialvalue=12*12) print(res) # 接收一個浮點(diǎn)數(shù) def print_float(): res = askfloat("Spam", "Egg weight\n(in tons)", minvalue=1, maxvalue=100) print(res) # 接收一個字符串 def print_string(): res = askstring("Spam", "Egg label") print(res) root = tk.Tk() tk.Button(root, text='取一個字符串', command=print_string).pack() tk.Button(root, text='取一個整數(shù)', command=print_integer).pack() tk.Button(root, text='取一個浮點(diǎn)數(shù)', command=print_float).pack() root.mainloop()
二、自定義窗口
如果要設(shè)置的參數(shù)個數(shù)超過兩個,那么tkinter提供的標(biāo)準(zhǔn)窗口就處理不了了。
這就需要自定義一個窗口,那么問題來了:怎樣將自定義窗口中的數(shù)據(jù)傳回主窗口?
百度查詢,不外乎兩種方法:全局變量(global)、對象變量([]、{}等),都不是我想要的。
然后,去 stackoverflow 逛了一下,綜合了個問題的答案,得到兩個本人比較滿意的方案。
一種是松耦合,另一種是緊耦合
1)松耦合
說明:
主窗類,繼承了 tk.Tk
彈窗類,繼承了 tk.Toplevel
要點(diǎn):
彈窗,將多個數(shù)據(jù),打包,放入一個名為 username
的私有 list 對象,銷毀彈窗
主窗,待彈窗運(yùn)行后,通過wait_window
方法,取得彈窗的名為 username
私有變量
完整代碼:
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) # 這一句很重要!??! return inputDialog.userinfo if __name__ == '__main__': app = MyApp() app.mainloop()
2)緊耦合
說明:
主窗類,繼承了 tk.Tk
彈窗類,繼承了 tk.Toplevel
要點(diǎn):
彈窗,顯式地保存父窗口,顯式地修改父窗口數(shù)據(jù),顯式地更新父窗口部件,最后銷毀彈窗
主窗,待彈窗運(yùn)行后,通過wait_window
方法,返回 None
完整代碼:
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)典教程》
希望本文所述對大家Python程序設(shè)計(jì)有所幫助。
- Python實(shí)現(xiàn)隨機(jī)選擇元素功能
- Python編程使用tkinter模塊實(shí)現(xiàn)計(jì)算器軟件完整代碼示例
- Python3 Tkinter選擇路徑功能的實(shí)現(xiàn)方法
- Python Tkinter模塊 GUI 可視化實(shí)例
- 詳解python tkinter模塊安裝過程
- python tkinter的消息框模塊(messagebox,simpledialog)
- python switch 實(shí)現(xiàn)多分支選擇功能
- python實(shí)現(xiàn)錄制全屏和選擇區(qū)域錄屏功能
- python tkinter模塊的簡單使用
- python使用tkinter模塊實(shí)現(xiàn)文件選擇功能
相關(guān)文章
Python queue隊(duì)列原理與應(yīng)用案例分析
這篇文章主要介紹了Python queue隊(duì)列原理與應(yīng)用,結(jié)合具體案例形式分析了Python queue隊(duì)列的原理、功能、實(shí)現(xiàn)方法與使用技巧,需要的朋友可以參考下2019-09-09Python 玩轉(zhuǎn)圖像格式轉(zhuǎn)換操作
這篇文章主要介紹了Python 玩轉(zhuǎn)圖像格式轉(zhuǎn)換方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03python筆記之mean()函數(shù)實(shí)現(xiàn)求取均值的功能代碼
這篇文章主要介紹了python筆記之mean()函數(shù)實(shí)現(xiàn)求取均值的功能代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07python多線程案例之多任務(wù)copy文件完整實(shí)例
這篇文章主要介紹了python多線程案例之多任務(wù)copy文件,結(jié)合完整實(shí)例形式分析了Python使用multiprocessing模塊實(shí)現(xiàn)基于多線程的文件拷貝相關(guān)操作技巧,需要的朋友可以參考下2019-10-10