Kivy安卓实战:6 |标签页和导航键初始化| 寫個工具箱把6 - 图1
© Karobben

由於語法渲染問題而影響閱讀體驗, 請移步博客閱讀~
本文GitPage地址

  1. CryptoWatch-Kivy 1.13
  2. Kivy 2.0.0
  3. Kivy-Garden 0.1.4
  4. kivy-garden.wordcloud 1.0.0
  5. kivymd 0.104.2.dev0

Quick Review

  1. tree
  1. .
  2. ├── bin
  3. └── KarobbenTB-1.3-armeabi-v7a-debug.apk
  4. ├── buildozer.spec
  5. ├── favicon.ico
  6. ├── font
  7. ├── ArtificialBox-WdD4.ttf
  8. | ...
  9. └── JingDianFanJiaoZhuan-1.ttf
  10. ├── Layout
  11. ├── filechooser.kv
  12. ├── menu.kv
  13. ├── Navigation_Draw.kv
  14. ├── Navigation_Tabs.kv
  15. └── Seq.kv
  16. ├── lib
  17. └── bio_seq.py
  18. ├── libWidget
  19. ├── filechooser.py
  20. ├── main.py
  21. ├── menu.py
  22. └── Seq.py
  23. ├── logo.png
  24. └── main.py

Function for Close Tab

Raw file

Added to widget

  1. mkdir config
  2. touch config/home.json
  3. touch config/Navi.json

Navi.json

  1. {
  2. "Seq":
  3. {"icon":"篆体","title":"Sequencs Tools","font":"font/HuaKangXinZhuanTi-1"},
  4. "editor":
  5. {"icon":"Text Editor","title":"editor", "font":"font/FangZhengHeiTiFanTi-1"}
  6. }
  1. + self.List = json.load(open('config/Navi.json'))
  2. + L = [i for i in self.List.keys()]
  3. + for x in L:
  4. + print(x)
  5. + text = f"[font={self.List[x]['font']}]{self.List[x]['icon']}[/font]"
  6. + X = MDRectangleFlatButton(text =text)
  7. + #X.font = self.List[x]['font']
  8. + X.on_release = lambda Dic = x:self.add_tag(Dic)
  9. + self.Widget_navi.ids.nav_button.add_widget(X)
  10. #from libWidget.Seq import FunctionWidget as tmp
  11. + Home_dic = json.load(open('config/home.json'))
  12. + for i in list(Home_dic.keys())[::-1]:
  13. + def HomeTabUpdate(self, Dic):
  14. + if Dic != None:
  15. + List = [icon.text.split("]")[0].replace("[ref=","") for icon in self.Widget_tabs.ids.tabs.get_tab_list()]+[self.List[Dic]['icon']]
  16. + List.remove("")
  17. + else:
  18. + List = [icon.text.split("]")[0].replace("[ref=","") for icon in self.Widget_tabs.ids.tabs.get_tab_list()]
  19. + List = list(set(List))
  20. + Result = []
  21. + for icon in List:
  22. + for Key in self.List.keys():
  23. + if self.List[Key]['icon']==icon:
  24. + Result += [Key]
  25. + Home_dic = {x:self.List[x] for x in Result}
  26. + with open("config/home.json",'w') as F:
  27. + F.write(json.dumps(Home_dic))
  28. def add_tag(self, Dic):
  29. ...
  30. + self.HomeTabUpdate(Dic)
  31. def on_ref_press(
  32. self,
  33. instance_tabs,
  34. instance_tab_label,
  35. instance_tab,
  36. instance_tab_bar,
  37. instance_carousel,
  38. ):
  39. + self.HomeTabUpdate(Dic=None)
  1. from kivy.uix.screenmanager import Screen
  2. from kivymd.uix.button import MDRectangleFlatButton
  3. from kivy.lang import Builder
  4. from kivy.uix.floatlayout import FloatLayout
  5. from kivymd.uix.tab import MDTabsBase
  6. from kivy.core.window import WindowBase
  7. from kivymd.icon_definitions import md_icons
  8. from kivymd.app import MDApp
  9. from libWidget.filechooser import ConfirmPopup
  10. import json
  11. WindowBase.softinput_mode = "below_target"
  12. # Function libs
  13. def OPEN(file):
  14. return open(file).read()
  15. class Tab(FloatLayout, MDTabsBase):
  16. '''Class implementing content for a tab.'''
  17. class MainApp(MDApp):
  18. ConfirmPopup = ConfirmPopup()
  19. #Editor = Editor()
  20. PATH = "."
  21. def change_text(self, Files):
  22. #self.the_time.text = str(Files)
  23. self.Button_test.text = Files[0]
  24. print("main screen", str(Files))
  25. def build(self):
  26. screen = Screen()
  27. screen.change_text = self.change_text
  28. # loading Navigation (left)
  29. self.Widget_navi = Builder.load_string(OPEN("Layout/Navigation_Draw.kv"))
  30. # loading navigation tags
  31. self.Widget_tabs = Builder.load_string(OPEN("Layout/Navigation_Tabs.kv"))
  32. #self.Widget_tabs.ids.tabs.on_ref_press = self.on_ref_press(*args)
  33. # loading The Function pages
  34. # Loading Sequencs function page
  35. screen.add_widget(self.Widget_tabs)
  36. screen.add_widget(self.Widget_navi)
  37. return screen
  38. # Functions for Navigation Ta
  39. def on_start(self):
  40. from lib.bio_seq import Bio as FunBioSeq
  41. Fun = FunBioSeq()
  42. print(Fun.List())
  43. def PP():
  44. print(Function_page.ids.seq_input.text)
  45. Function_page.ids.seq_result.text = Function_page.ids.seq_input.text.upper()
  46. Fun = FunBioSeq()
  47. self.List = json.load(open('config/Navi.json'))
  48. '''
  49. Navigation test
  50. '''
  51. Num = 0
  52. L = [i for i in self.List.keys()]
  53. for x in L:
  54. print(x)
  55. text = f"[font={self.List[x]['font']}]{self.List[x]['icon']}[/font]"
  56. X = MDRectangleFlatButton(text =text)
  57. #X.font = self.List[x]['font']
  58. X.on_release = lambda Dic = x:self.add_tag(Dic)
  59. self.Widget_navi.ids.nav_button.add_widget(X)
  60. '''
  61. locals()["Btn_".format(self.List[i]['icon'])] = MDRectangleFlatButton(
  62. text=self.List[i]['icon'],
  63. font_name = self.List[i]['font'],
  64. on_release =
  65. lambda x = i:self.add_tag(i))
  66. self.Widget_navi.ids.nav_button.add_widget(locals()["Btn_".format(self.List[i]['icon'])])
  67. '''
  68. #from libWidget.Seq import FunctionWidget as tmp
  69. Home_dic = json.load(open('config/home.json'))
  70. for i in list(Home_dic.keys())[::-1]:
  71. tmp_tab = Tab(text=f"[ref={self.List[i]['icon']}][color=#fa937f][font=font/heydings-icons-1]{'X'}[/font][/color][/ref] [font={self.List[i]['font']}]{self.List[i]['icon']}[/font]")
  72. Module = __import__('libWidget.'+i, globals(), locals(), [], 0)
  73. Fun = eval("Module."+i+".FunctionWidget()")
  74. screen_tmp = Screen()
  75. screen_tmp.name = i
  76. screen_tmp.add_widget(Fun.main())
  77. tmp_tab.add_widget(screen_tmp)
  78. self.Widget_tabs.ids.tabs.add_widget(tmp_tab)
  79. def add_tag(self, Dic):
  80. print(Dic)
  81. name_tab = self.List[Dic]['icon']
  82. Tag_title = f"[ref={name_tab}][font=font/heydings-icons-1][color=#fa937f]{'X'}[/color][/font][/ref][font=./font/JingDianFanJiaoZhuan-1][font={self.List[Dic]['font']}]{name_tab}[/font]"
  83. tmp_tab =Tab( text = Tag_title)
  84. Module = __import__('libWidget.'+Dic, globals(), locals(), [], 0)
  85. Fun = eval("Module."+Dic+".FunctionWidget()")
  86. screen_tmp = Screen()
  87. screen_tmp.name = "Test"
  88. screen_tmp.add_widget(Fun.main())
  89. tmp_tab.add_widget(screen_tmp)
  90. self.Widget_tabs.ids.tabs.add_widget(tmp_tab)
  91. self.Widget_tabs.ids.tabs.switch_tab(Tag_title)
  92. self.Widget_navi.ids.nav_drawer.set_state("close")
  93. # Update Tages in First page
  94. self.HomeTabUpdate(Dic)
  95. def HomeTabUpdate(self, Dic):
  96. if Dic != None:
  97. List = [icon.text.split("]")[0].replace("[ref=","") for icon in self.Widget_tabs.ids.tabs.get_tab_list()]+[self.List[Dic]['icon']]
  98. List.remove("")
  99. else:
  100. List = [icon.text.split("]")[0].replace("[ref=","") for icon in self.Widget_tabs.ids.tabs.get_tab_list()]
  101. List = list(set(List))
  102. Result = []
  103. for icon in List:
  104. for Key in self.List.keys():
  105. if self.List[Key]['icon']==icon:
  106. Result += [Key]
  107. Home_dic = {x:self.List[x] for x in Result}
  108. with open("config/home.json",'w') as F:
  109. F.write(json.dumps(Home_dic))
  110. # Functions for Navigation Tab Switch
  111. def on_tab_switch(
  112. self, instance_tabs, instance_tab, instance_tab_label, tab_text):
  113. '''Called when switching tabs.
  114. :type instance_tabs: <kivymd.uix.tab.MDTabs object>;
  115. :param instance_tab: <__main__.Tab object>;
  116. :param instance_tab_label: <kivymd.uix.tab.MDTabsLabel object>;
  117. :param tab_text: text or name icon of tab;
  118. '''
  119. instance_tab.ids.label.text = tab_text
  120. def on_ref_press(
  121. self,
  122. instance_tabs,
  123. instance_tab_label,
  124. instance_tab,
  125. instance_tab_bar,
  126. instance_carousel,
  127. ):
  128. '''
  129. The method will be called when the ``on_ref_press`` event
  130. occurs when you, for example, use markup text for tabs.
  131. :param instance_tabs: <kivymd.uix.tab.MDTabs object>
  132. :param instance_tab_label: <kivymd.uix.tab.MDTabsLabel object>
  133. :param instance_tab: <__main__.Tab object>
  134. :param instance_tab_bar: <kivymd.uix.tab.MDTabsBar object>
  135. :param instance_carousel: <kivymd.uix.tab.MDTabsCarousel object>
  136. '''
  137. # Removes a tab by clicking on the close icon on the left.
  138. for instance_tab in instance_carousel.slides:
  139. if instance_tab.text == instance_tab_label.text:
  140. instance_tabs.remove_widget(instance_tab_label)
  141. break
  142. self.HomeTabUpdate(Dic=None)
  143. MainApp().run()

We can also add a json for initializing the home page so we can reload the tabs we keeped in last time.

home.json

  1. {
  2. "Font":
  3. {"icon":"篆体","title":"Fonttoo Tools","font":"font/HuaKangXinZhuanTi-1"}
  4. }

Enjoy~

本文由Python腳本GitHub/語雀自動更新

由於語法渲染問題而影響閱讀體驗, 請移步博客閱讀~
本文GitPage地址

GitHub: Karobben
Blog:Karobben
BiliBili:史上最不正經的生物狗