我正在嘗試創建一個串列,然后使用 python 和 tkinter 從串列中添加/讀取專案。
我需要創建一個空白串列,并在其中添加內容,然后能夠從另一個類的函式中創建的小部件中清除條目。我已經嘗試了所有的方法,但卻不知道如何像我需要的那樣訪問小組件/串列。
我一直得到的錯誤是 AttributeError: 'function' object has no attribute 'data'
。希望得到任何幫助。
from tkinter import font as tkfont
class SampleApp(tk.Tk)。
def __init__(self, *args, **kwargs)。
tk.Tk.__init__(self, *args, **kwargs)
self.title_font = tkfont.Font(family='Helvetica', size=18, weight=" bold", slant="italic")
container = tk.Frame(self)
container.pack(side="top", fill="both", expand=True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0,weight=1)
self.frames = {}。
self.frames["StartPage"] = StartPage(father=container, controller=self)
self.frames["StartPage"].grid(row=0, column=0, sticky="nsew")
self.show_frame("StartPage")
def show_frame(self, page_name)。
''為給定的頁面名稱顯示一個框架''。
frame = self.frames[page_name]
frame.tkraise()
class StartPage(tk.Frame)。
def __init__(self, parent, controller)。
tk.Frame.__init__(self, parent)
self.controller = controller
self.grid(columnspan=5, rowspan=5)
self.start = tk.Button(self, text='Start' , command=lambda: self.start_frame()
self.start.pack(side='top')
def start_frame(self)。
資料 = []
frame = tk.Frame(self)
frame.pack(side='top'/span>, fill='both'/span>)
entry = tk.Text(frame)
entry.bind('<Return>', lambda 事件: stored_functions.print_date(self, entry=entry.get('1.0', 'end-1c') )
entry.pack(side='top')
class stored_functions()。
def print_date(self, entry)。
StartPage.start_frame.entry.delete('1.0', tk.END)
all_entries = StartPage.start_frame.data
print('The last entry was {})
這里是所有的條目。{}'.format(entry, all_entries)
if __name__ == "__main__"/span>:
app = SampleApp()
app.mainloop()
uj5u.com熱心網友回復:
為了從一個類中獲取變數,你需要先初始化它。在StartPage.start_frame.entry.delete('1.0', tk.END)這一行,你試圖從StartPage類本身,而不是該類的instance中訪問一個變數。您還試圖訪問 start_frame 方法的變數 (start_frame.entry),而沒有呼叫該方法。
當你在entry.bind('<Return>', lambda event: stored_functions.print_date(self, entry=entry.get('1. 0', 'end-1C')),你犯了一個類似的錯誤,使用stored_functions.print_date(...,而不是stored_functions().print_date(...(注意圓括號)。
當你需要訪問一個方法之外的變數時,良好的做法是在開始時用self.創建該變數。這使得該變數可以在整個類中被訪問,也可以被使用該類實體的外部代碼訪問。以下是修改后的代碼,添加和編輯的行數都有相應的標記:
import tkinter as tk
from tkinter import font as tkfont
class SampleApp(tk.Tk)。
def __init__(self, *args, **kwargs)。
tk.Tk.__init__(self, *args, **kwargs)
self.title_font = tkfont.Font(family='Helvetica', size=18, weight=" bold", slant="italic")
container = tk.Frame(self)
container.pack(side="top", fill="both", expand=True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0,weight=1)
self.frames = {}。
self.frames["StartPage"] = StartPage(father=container, controller=self)
self.frames["StartPage"].grid(row=0, column=0, sticky="nsew")
self.show_frame("StartPage")
def show_frame(self, page_name)。
''為給定的頁面名稱顯示一個框架''。
frame = self.frames[page_name]
frame.tkraise()
class StartPage(tk.Frame)。
def __init__(self, parent, controller)。
tk.Frame.__init__(self, parent)
self.controller = controller
self.grid(columnspan=5, rowspan=5)
self.start = tk.Button(self, text='Start' , command=lambda: self.start_frame()
self.start.pack(side='top')
def start_frame(self)。
self.data = []
frame = tk.Frame(self)
frame.pack(side='top'/span>, fill='both'/span>)
self.entry = tk.Text(frame) ### EDITED LINE[/span
self.entry.bind('<Return>', lambda event: stored_functions(). print_date(self, entry=self.entry.get('1.0', 'end-1c') ) ### EDITED LINE[/span]。
self.entry.pack(side='top') ### EDITED LINE[/span
class stored_functions()。
def print_date(self, start_page, entry)。### EDITED LINE。
start_page.entry.delete('1.0', tk.END) ### EDITED LINE[/span
all_entries = start_page.data ### EDITED LINE[/span]。
print('最后一個條目是{}。
這里是所有的條目。{}'.format(entry, all_entries)
if __name__ == "__main__"/span>:
app = SampleApp()
app.mainloop()
我改變了系結條目的行,所以當"<Enter>"被按下時,它將StartPage的實體和條目的文本作為引數傳遞給stored_functions.print_date()。
注意,當條目在 如果你有任何疑問或問題,請告訴我!
標籤:StartPage.start_frame()中被創建時,它被稱為self.entry,而不是簡單的entry。還需要注意的是,stored_functions.print_date()使用start_page.entry而不是StartPage.start_frame.entry,以及start_page.data而不是StartPage.start_frame.data>。這是因為start_page參考的是StartPage類的一個實體,而不是該類本身。
