Python TK Notebook 选项卡更改检查
Python TK Notebook tab change check
这里是新手程序员。我正在构建一个基于 tk 的桌面应用程序,运行 遇到一个问题:
我有一个主 window,里面有几个东西,包括两个标签:
global nBook
nBook = ttk.Notebook(self, name="book")
nBook.place(x=300,y=400)
frameOne = ttk.Frame(nBook, width=100, height=100)
frameTwo = ttk.Frame(nBook, width=100, height=100)
nBook.add(frameOne, text='T1')
nBook.add(frameTwo, text='T2')
frameOne.bind("<<NotebookTabChanged>>", self.routine())
frameTwo.bind("<<NotebookTabChanged>>", self.routine())
routine() 是一个函数,每次选择 T2 时都应该执行检查
def routine(self):
if str(nBook.index(nBook.select())) == "2":
# Do stuff
else:
pass
问题是,当我打开应用程序时,除了调用例程函数,而不再重新调用例程函数外,它不执行任何操作。我只是不知道我做错了什么。
谁能指出我犯的错误?
编辑:如果我尝试同样的问题
nBook.bind("<<NotebookTabChanged>>", self.xbRoutine())
错误来自事件绑定语句:当使用self.routine()
时,回调是在执行bind
语句时调用的,而不是在触发事件时调用的。为了获得正确的行为,bind
的第二个参数应该是函数的名称而不是对该函数的调用,因此只需删除括号即可。
另一个错误:当使用 bind
时,回调函数应该有第一个参数(传统上称为 event
)存储事件参数。所以你应该将你的回调定义为:
def routine(self, event):
...
我遇到了同样的问题。 @sciroccorics 给出的答案并不完整。
你绑定的不是tab本身,而是notebook
所以,应该是
nBook.bind("<<NotebookTabChanged>>", self.xbRoutine)
这里是新手程序员。我正在构建一个基于 tk 的桌面应用程序,运行 遇到一个问题:
我有一个主 window,里面有几个东西,包括两个标签:
global nBook
nBook = ttk.Notebook(self, name="book")
nBook.place(x=300,y=400)
frameOne = ttk.Frame(nBook, width=100, height=100)
frameTwo = ttk.Frame(nBook, width=100, height=100)
nBook.add(frameOne, text='T1')
nBook.add(frameTwo, text='T2')
frameOne.bind("<<NotebookTabChanged>>", self.routine())
frameTwo.bind("<<NotebookTabChanged>>", self.routine())
routine() 是一个函数,每次选择 T2 时都应该执行检查
def routine(self):
if str(nBook.index(nBook.select())) == "2":
# Do stuff
else:
pass
问题是,当我打开应用程序时,除了调用例程函数,而不再重新调用例程函数外,它不执行任何操作。我只是不知道我做错了什么。
谁能指出我犯的错误?
编辑:如果我尝试同样的问题
nBook.bind("<<NotebookTabChanged>>", self.xbRoutine())
错误来自事件绑定语句:当使用self.routine()
时,回调是在执行bind
语句时调用的,而不是在触发事件时调用的。为了获得正确的行为,bind
的第二个参数应该是函数的名称而不是对该函数的调用,因此只需删除括号即可。
另一个错误:当使用 bind
时,回调函数应该有第一个参数(传统上称为 event
)存储事件参数。所以你应该将你的回调定义为:
def routine(self, event):
...
我遇到了同样的问题。 @sciroccorics 给出的答案并不完整。 你绑定的不是tab本身,而是notebook
所以,应该是
nBook.bind("<<NotebookTabChanged>>", self.xbRoutine)