Kivy GUi mit mehreren Tabs. Aktuellen tab fokussieren
Verfasst: Mittwoch 21. November 2018, 16:04
Guten Tag,
ich bin grad dabei eine GUI in Kivy zu schreiben. Diese ist relativ klein und hat 5 Buttons, einen Slider und ein Canvas(aktuelle noch Button).
Bisher habe ich einen Standard tab in dem ein Button ist, der eine Funktion auslöst, die mir einen zusätzlichen Tab öffnet mit oben besagten Buttons und Canvas.
Siehe bilder:
https://ibb.co/jUnm0V
https://ibb.co/dJKS7A
Nun hätte ich gerne wenn ich den Button set focus drücke, dass der slider den Wert 0 annimmt. Das klappt auch wenn es nur einen Tab gibt. Sobald ich zwei tabs habe, und den Button setfocus aus dem Tab 1 drücke verändert sich jedoch der slider aus Tab 2.
Ich dachte das könnte ich umgehen, wenn ich jedem Widget eines Tabs die ID übergebe, die der Länge der Liste der Tabs entspricht. Sprich alle widgets des ersten Tabs haben die ID 1 und die Widgets des zweiten Tabs die ID 2. Das klappt auch soweit.
Wenn ich nun per bind eine Methode an ein Widget knüpfe, wird ja auch das Objekt übergeben. Also habe ich die ID des übergebenen Objekts also des Buttons aus Tab 1 der ID des Sliders übergeben, sodass also auch der Slider des Tab 1 addressiert wird, was jedoch nicht klappt.
Wie könnte man sowas bewerkstelligen ?
Besten Dank im vorraus
Anbei hier der Code:
class RootWidget(BoxLayout):
def __init__(self,**kwargs):
super(RootWidget, self).__init__(**kwargs)
self.liste=[]
self.tp=TabbedPanel(do_default_tab=False)
self.add_widget(self.tp)
self.thd=TabbedPanelItem(text='+')
self.tp.add_widget(self.thd)
self.b_add=Button(text='add tab')
self.thd.add_widget(self.b_add)
self.b_add.bind(on_press=self.addtab)
def addtab(self, test=None):
self.tp.add_widget(self.createtabs())
def createtabs(self):
print('Button is pressed')
self.th=TabbedPanelItem(text='Tab '+str(len(self.tp.tab_list)),id=str(len(self.tp.tab_list)))
self.th.focus=self.th
#self.tp.add_widget(self.th)
self.Box=BoxLayout(orientation='vertical',id=str(len(self.tp.tab_list)))
self.BoxL=BoxLayout(id=str(len(self.tp.tab_list)))
self.BoxR=GridLayout(cols=6,id=str(len(self.tp.tab_list)))
self.th.add_widget(self.Box)
self.Box.add_widget(self.BoxR)
self.Box.add_widget(self.BoxL)
#should be the matplotlib canvas
self.b2=Button(text='btn 2',id=str(len(self.tp.tab_list)))
self.b_convert=Button(text='convert .nsdx to .txt',id=str(len(self.tp.tab_list)))
self.b_load=Button(text='load data',id=str(len(self.tp.tab_list)))
self.b_setfocus=Button(text='set focus',id=str(len(self.tp.tab_list)))
self.b_calcbeam=Button(text='calculate\nbeamproperties',id=str(len(self.tp.tab_list)))
self.b_export=Button(text='export plot',id=str(len(self.tp.tab_list)))
self.s_slider=Slider(id=str(len(self.tp.tab_list)),min=0,max=100,value=50)
#buttons
self.BoxL.add_widget(self.b2)
self.BoxR.add_widget(self.b_convert)
self.BoxR.add_widget(self.b_load)
self.BoxR.add_widget(self.b_setfocus)
self.BoxR.add_widget(self.b_calcbeam)
self.BoxR.add_widget(self.b_export)
self.BoxR.add_widget(self.s_slider)
#bind functions
self.b_convert.bind(on_press=self.callback)
self.b_setfocus.bind(on_press=self.setfocus)
return self.th
def setfocus(self,actualbutton):
actualbutton.id
self.s_slider.id=actualbutton.id
self.s_slider.value=0
return
ich bin grad dabei eine GUI in Kivy zu schreiben. Diese ist relativ klein und hat 5 Buttons, einen Slider und ein Canvas(aktuelle noch Button).
Bisher habe ich einen Standard tab in dem ein Button ist, der eine Funktion auslöst, die mir einen zusätzlichen Tab öffnet mit oben besagten Buttons und Canvas.
Siehe bilder:
https://ibb.co/jUnm0V
https://ibb.co/dJKS7A
Nun hätte ich gerne wenn ich den Button set focus drücke, dass der slider den Wert 0 annimmt. Das klappt auch wenn es nur einen Tab gibt. Sobald ich zwei tabs habe, und den Button setfocus aus dem Tab 1 drücke verändert sich jedoch der slider aus Tab 2.
Ich dachte das könnte ich umgehen, wenn ich jedem Widget eines Tabs die ID übergebe, die der Länge der Liste der Tabs entspricht. Sprich alle widgets des ersten Tabs haben die ID 1 und die Widgets des zweiten Tabs die ID 2. Das klappt auch soweit.
Wenn ich nun per bind eine Methode an ein Widget knüpfe, wird ja auch das Objekt übergeben. Also habe ich die ID des übergebenen Objekts also des Buttons aus Tab 1 der ID des Sliders übergeben, sodass also auch der Slider des Tab 1 addressiert wird, was jedoch nicht klappt.
Wie könnte man sowas bewerkstelligen ?
Besten Dank im vorraus
Anbei hier der Code:
class RootWidget(BoxLayout):
def __init__(self,**kwargs):
super(RootWidget, self).__init__(**kwargs)
self.liste=[]
self.tp=TabbedPanel(do_default_tab=False)
self.add_widget(self.tp)
self.thd=TabbedPanelItem(text='+')
self.tp.add_widget(self.thd)
self.b_add=Button(text='add tab')
self.thd.add_widget(self.b_add)
self.b_add.bind(on_press=self.addtab)
def addtab(self, test=None):
self.tp.add_widget(self.createtabs())
def createtabs(self):
print('Button is pressed')
self.th=TabbedPanelItem(text='Tab '+str(len(self.tp.tab_list)),id=str(len(self.tp.tab_list)))
self.th.focus=self.th
#self.tp.add_widget(self.th)
self.Box=BoxLayout(orientation='vertical',id=str(len(self.tp.tab_list)))
self.BoxL=BoxLayout(id=str(len(self.tp.tab_list)))
self.BoxR=GridLayout(cols=6,id=str(len(self.tp.tab_list)))
self.th.add_widget(self.Box)
self.Box.add_widget(self.BoxR)
self.Box.add_widget(self.BoxL)
#should be the matplotlib canvas
self.b2=Button(text='btn 2',id=str(len(self.tp.tab_list)))
self.b_convert=Button(text='convert .nsdx to .txt',id=str(len(self.tp.tab_list)))
self.b_load=Button(text='load data',id=str(len(self.tp.tab_list)))
self.b_setfocus=Button(text='set focus',id=str(len(self.tp.tab_list)))
self.b_calcbeam=Button(text='calculate\nbeamproperties',id=str(len(self.tp.tab_list)))
self.b_export=Button(text='export plot',id=str(len(self.tp.tab_list)))
self.s_slider=Slider(id=str(len(self.tp.tab_list)),min=0,max=100,value=50)
#buttons
self.BoxL.add_widget(self.b2)
self.BoxR.add_widget(self.b_convert)
self.BoxR.add_widget(self.b_load)
self.BoxR.add_widget(self.b_setfocus)
self.BoxR.add_widget(self.b_calcbeam)
self.BoxR.add_widget(self.b_export)
self.BoxR.add_widget(self.s_slider)
#bind functions
self.b_convert.bind(on_press=self.callback)
self.b_setfocus.bind(on_press=self.setfocus)
return self.th
def setfocus(self,actualbutton):
actualbutton.id
self.s_slider.id=actualbutton.id
self.s_slider.value=0
return