У меня есть простое приложение на основе tkinter и ttk. У меня есть виджет блокнота, который должен создавать ограниченное количество вкладок, и вкладки - это одно и то же. Но мне нужно делать разные действия на каждом из них. Когда я нажимаю какую-либо кнопку, создается вкладка с собственным именем, и привязка события будет фокусироваться на ней. Если я выберу предыдущую вкладку, созданную нажатием кнопки, привязка события не будет фокусироваться ни на ней, ни на ее дочерних виджетах, и это проблема, которую мне нужно решить. Могу ли я переключать привязку событий между вкладками? Какие-либо предложения? Я использую питон 2.7
Вопрос
Как переключить привязку событий на вкладках виджета записной книжки
Ответы
Ответ 1 · рейтинг 4 · furas
См. мой ответ на вопрос как создать экземпляры события для каждой отдельной вкладки в графическом интерфейсе с несколькими вкладками tkinter (виджет ноутбука), чтобы увидеть рабочий пример.
Я использую класс MyTab для создания новой вкладки с собственной привязкой событий, поэтому я могу создать много одинаковых вкладок, и каждая вкладка использует собственную привязку событий. В примерах на вкладках отображается другое сообщение при смене вкладки.
Вы не добавили код в свой вопрос, поэтому я не могу добавить более подробный ответ.
ИЗМЕНИТЬ:
пример из предыдущей ссылки + привязка к фрейму:
- непосредственно в
MyTab:self.bind("<Button-1>", self.clickFrame)(функция вызова левой кнопкой мыши вMyTab - в
Application:tab.bind("<Button-3>", self.clickTab)(функция вызова правой кнопкой мыши вApplication
код:
#!/usr/bin/env python
from Tkinter import *
import tkMessageBox
import ttk
#---------------------------------------------------------------------
class MyTab(Frame):
def __init__(self, root, name):
Frame.__init__(self, root)
self.root = root
self.name = name
self.entry = Entry(self)
self.entry.pack(side=TOP)
self.entry.bind('<FocusOut>', self.alert)
self.entry.bind('<Key>', self.printing)
self.bind("<Button-1>", self.clickFrame)
#-------------------------------
def alert(self, event):
print 'FocusOut event is working for ' + self.name + ' value: ' + self.entry.get()
#tkMessageBox.showinfo('alert', 'FocusOut event is working for ' + self.name + ' value: ' + self.entry.get())
#-------------------------------
def printing(self, event):
print event.keysym + ' for ' + self.name
#-------------------------------
def clickFrame(self, event):
print "MyTab: click at (" + str(event.x) + ", " + str(event.y) + ') for ' + self.name + " (parent name: " + self.root.tab(CURRENT)['text'] + ")"
#---------------------------------------------------------------------
class Application():
def __init__(self):
self.tabs = {'ky':1}
self.root = Tk()
self.root.minsize(300, 300)
self.root.geometry("1000x700")
self.notebook = ttk.Notebook(self.root, width=1000, height=650)
# self.all_tabs = []
self.addTab('tab1')
self.button = Button(self.root, text='generate', command=self.start_generating).pack(side=BOTTOM)
self.notebook.pack(side=TOP)
#-------------------------------
def addTab(self, name):
tab = MyTab(self.notebook, name)
tab.bind("<Button-3>", self.clickTab)
self.notebook.add(tab, text="X-"+name)
# self.all_tabs.append(tab)
#-------------------------------
def clickTab(self, event):
print "Application: click at (" + str(event.x) + ", " + str(event.y) + ') for ' + event.widget.name
#-------------------------------
def start_generating(self):
if self.tabs['ky'] < 4:
self.tabs['ky'] += 1
self.addTab('tab'+ str(self.tabs['ky']))
#-------------------------------
def run(self):
self.root.mainloop()
#----------------------------------------------------------------------
Application().run()
Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.
Похожие материалы
- 5 лучших языков программирования для изучения в 2023 году
- Изучайте программирование, делая это неправильно
- Leetcoding 88: Объединение отсортированного массива
- Прогнозирование эффективности эссе с помощью MLP + BERT
- WPF + динамические элементы управления + события таймера активности
- Пример кнопки поиска ASP.Net для загрузки GridView?