聽起來好像您正在嘗試創建一個可以程序化操作的GUI,這不起作用。圖形用戶界面不是過程化的,它們的代碼不會線性運行,而函數會調用返回值的回調函數。你所問的並不是tkinter獨有的。這是基於事件的GUI編程的本質 - 回調函數不能返回任何內容,因爲調用者是事件而不是函數。
粗略地說,你必須使用某種全局對象來存儲你的數據。通常這被稱爲「模型」。它可以是全局變量,也可以是數據庫,也可以是某種對象。無論如何,它必須「全球化」存在;也就是說,它必須可供整個GUI訪問。
通常,此訪問由稱爲「控制器」的第三個組件提供。它是GUI(「視圖」)和數據(「模型」)之間的接口。這三個組件構成了所謂的模型 - 視圖 - 控制器模式或MVC。
模型,視圖和控制器不一定是三個不同的對象。通常,GUI和控制器是同一個對象。對於小型程序來說,這很有效 - GUI組件直接與您的數據模型進行對話。
例如,您可以有一個類表示從Tkinter.Toplevel繼承的窗口。它可以具有表示正在編輯的數據的屬性。當用戶從主窗口選擇「新建」時,它會執行類似self.tileset = TileSet(filename)
的操作。也就是說,它將名爲self
的GUI對象的名爲tileset
的屬性設置爲特定於給定文件名的TileSet
類的實例。後面的操作數據的函數使用self.tileset
來訪問對象。對於主窗口對象之外的函數(例如,主窗口中的「全部保存」函數),您可以將此對象作爲參數傳遞,或者將窗口對象用作控制器,要求它對其執行某些操作地形設置。
下面是一個簡單的例子:
import Tkinter as tk
import tkFileDialog
import datetime
class SampleApp(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
self.windows = []
menubar = tk.Menu(self)
self.configure(menu=menubar)
fileMenu = tk.Menu(self)
fileMenu.add_command(label="New...", command=self.new_window)
fileMenu.add_command(label="Save All", command=self.save_all)
menubar.add_cascade(label="Window", menu=fileMenu)
label = tk.Label(self, text="Select 'New' from the window menu")
label.pack(padx=20, pady=40)
def save_all(self):
# ask each window object, which is acting both as
# the view and controller, to save it's data
for window in self.windows:
window.save()
def new_window(self):
filename = tkFileDialog.askopenfilename()
if filename is not None:
self.windows.append(TileWindow(self, filename))
class TileWindow(tk.Toplevel):
def __init__(self, master, filename):
tk.Toplevel.__init__(self, master)
self.title("%s - Tile Editor" % filename)
self.filename = filename
# create an instance of a TileSet; all other
# methods in this class can reference this
# tile set
self.tileset = TileSet(filename)
label = tk.Label(self, text="My filename is %s" % filename)
label.pack(padx=20, pady=40)
self.status = tk.Label(self, text="", anchor="w")
self.status.pack(side="bottom", fill="x")
def save(self):
# this method acts as a controller for the data,
# allowing other objects to request that the
# data be saved
now = datetime.datetime.now()
self.status.configure(text="saved %s" % str(now))
class TileSet(object):
def __init__(self, filename):
self.data = "..."
if __name__ == "__main__":
app = SampleApp()
app.mainloop()
'按鈕(根,文本= 「foo」 的,命令=拉姆達ARG = 「foo」 的:回調(ARG))' –