python ScreenManager仅接受屏幕小部件的问题

pu3pd22g  于 2024-01-05  发布在  Python
关注(0)|答案(1)|浏览(218)

我已经写了一个注册页面为我的应用程序.一切都很顺利,直到我更新与角色选项选择代码.我已经尝试调试,但问题仍然存在.
main.py `

  1. # main.py
  2. from kivy.core.text import LabelBase
  3. from kivy.uix.screenmanager import ScreenManager, Screen
  4. from kivymd.app import MDApp
  5. from kivy.lang import Builder
  6. from kivy.core.window import Window
  7. from kivy.factory import Factory
  8. from kivy.uix.button import Button
  9. import requests
  10. Window.size = (310, 580)
  11. class NavBarScreen(Screen):
  12. pass
  13. class HomeScreen(Screen):
  14. pass
  15. class SignUpScreen(Screen):
  16. def __init__(self, **kwargs):
  17. super().__init__(**kwargs)
  18. self.dropdown = DropDown()
  19. self.role_button = Button(text='Select Role', size_hint=(None, None), height=44)
  20. self.role_button.bind(on_release=self.dropdown.open)
  21. self.dropdown.bind(on_select=lambda instance, x: setattr(self.role_button, 'text', x))
  22. self.add_widget(self.role_button)
  23. for role in ["Farmer", "Administrator"]:
  24. btn = Button(text=role, size_hint_y=None, height=44)
  25. btn.bind(on_release=lambda btn: self.dropdown.select(btn.text))
  26. self.dropdown.add_widget(btn)
  27. def signup_request(self, username, password, role):
  28. signup_data = {"username": username, "password": password, "role": role}
  29. api_url = "https://c272-2001-d08-d2-d387-2cd9-bbf2-5f29-cacf.ngrok-free.app/signup"
  30. response = requests.post(api_url, json=signup_data)
  31. if response.status_code == 200:
  32. print("Successfully signed up! Token: ", response.json()["access_token"])
  33. else:
  34. print("Signup failed. Error: ", response.json()["detail"])
  35. class Myapp(MDApp):
  36. def build(self):
  37. screen_manager = ScreenManager()
  38. screen_manager.add_widget(Builder.load_file("start.kv"))
  39. screen_manager.add_widget(Builder.load_file("signup.kv"))
  40. screen_manager.add_widget(Builder.load_file("login.kv"))
  41. home_screen = HomeScreen(name="home")
  42. home_screen.add_widget(NavBarScreen())
  43. screen_manager.add_widget(home_screen)
  44. return screen_manager
  45. def show_role_dropdown(self, text_field):
  46. text_field.focus = False
  47. self.screen.ids.role_dropdown.open()
  48. def select_role(self, role):
  49. self.screen.ids.role_input.text = role
  50. self.screen.ids.role_dropdown.dismiss()
  51. def change_color(self, instance):
  52. if instance in self.root.ids.values():
  53. current_id = list(self.root.ids.keys())[list(self.root.ids.values()).index(instance)]
  54. for i in range(4):
  55. if f"nav_icon{i}" == current_id:
  56. self.root.ids[f"nav_icon{i + 1}"].text_color = 1, 0, 0, 1
  57. else:
  58. self.root.ids[f"nav_icon{i + 1}"].text_color = 0, 0, 0, 1
  59. def goto_home_screen(self):
  60. self.root.current = "home"
  61. if __name__ == "__main__":
  62. LabelBase.register(name="Poppins-Medium", fn_regular=r"C:\Users\User\Desktop\FONT\Poppins\Poppins-Medium.ttf")
  63. LabelBase.register(name="Poppins-SemiBold", fn_regular=r"C:\Users\User\Desktop\FONT\Poppins\Poppins-SemiBold.ttf")
  64. Factory.register("NavBarScreen", cls=NavBarScreen)
  65. # Create an instance of Myapp and run it
  66. app = Myapp()
  67. app.run()

字符串
signup.kv

  1. # signup.kv
  2. <SignUpScreen>:
  3. name: "signup"
  4. MDScreen:
  5. MDFloatLayout:
  6. md_bg_color: rgba(246, 250, 247, 255)
  7. Image:
  8. source: r"C:\Users\User\Desktop\FONT\Pytho2farmers.zip"
  9. pos_hint: {"center_x": 0.75, "center_y": .15}
  10. MDIconButton:
  11. icon: "arrow-left"
  12. pos_hint: {"center_y": .95}
  13. user_font_size: "30sp"
  14. theme_text_color: "Custom"
  15. text_color: rgba(26, 24, 58, 255)
  16. on_release:
  17. root.manager.transition.direction = "right"
  18. root.manager.current = "main"
  19. MDLabel:
  20. text: "Hi!"
  21. font_name: "Poppins-SemiBold"
  22. font_size: "26sp"
  23. pos_hint: {"center_x": .6,"center_y": .85}
  24. color: rgba(48, 62, 39, 255)
  25. MDLabel:
  26. text: "Create an account"
  27. font_name: "Poppins-SemiBold"
  28. font_size: "18sp"
  29. pos_hint: {"center_x": .6, "center_y": .79}
  30. color: rgba(180, 187, 114, 255)
  31. MDFloatLayout:
  32. size_hint: .7, .07
  33. pos_hint: {"center_x":.5, "center_y":.71}
  34. TextInput:
  35. hint_text: "Username"
  36. font_name: "Poppins-Medium"
  37. size_hint_y: .75
  38. pos_hint: {"center_x":.5, "center_y":.5}
  39. background_color: 1, 1, 1, 0
  40. foreground_color: rgba(0, 0, 59, 255)
  41. cursor_color: rgba(0, 0, 59, 255)
  42. font_size: "14sp"
  43. cursor_width: "2sp"
  44. multiline: False
  45. MDFloatLayout:
  46. pos_hint: {"center_x": .5, "center_y": 0}
  47. size_hint_y: .03
  48. md_bg_color: rgba(178, 178, 178, 255)
  49. MDFloatLayout:
  50. size_hint: .7, .07
  51. pos_hint: {"center_x":.5, "center_y":.6}
  52. TextInput:
  53. hint_text: "Password"
  54. font_name: "Poppins-Medium"
  55. size_hint_y: .75
  56. pos_hint: {"center_x":.5, "center_y":.5}
  57. background_color: 1, 1, 1, 0
  58. foreground_color: rgba(0, 0, 59, 255)
  59. cursor_color: rgba(0, 0, 59, 255)
  60. font_size: "14sp"
  61. cursor_width: "2sp"
  62. multiline: False
  63. MDFloatLayout:
  64. pos_hint: {"center_x": .5, "center_y": 0}
  65. size_hint_y: .03
  66. md_bg_color: rgba(178, 178, 178, 255)
  67. MDFloatLayout:
  68. size_hint: .7, .07
  69. pos_hint: {"center_x":.5, "center_y":.6}
  70. MDTextField:
  71. id: role_input # Add this ID
  72. hint_text: "Role"
  73. font_name: "Poppins-Medium"
  74. size_hint_y: .75
  75. pos_hint: {"center_x": .5, "center_y": .5}
  76. background_color: 1, 1, 1, 0
  77. foreground_color: rgba(0, 0, 59, 255)
  78. cursor_color: rgba(0, 0, 59, 255)
  79. font_size: "14sp"
  80. cursor_width: "2sp"
  81. multiline: False
  82. readonly: True
  83. on_focus: if self.focus: app.show_role_dropdown(self)
  84. MDRaisedButton:
  85. id: role_dropdown_btn
  86. pos_hint: {'center_x': .5, 'center_y': .6}
  87. text: "Choose Role"
  88. on_release: app.show_role_dropdown(role_input)
  89. MDRaisedButton:
  90. text: "SIGNUP"
  91. size_hint: .66, .065
  92. pos_hint: {"center_x": .5, "center_y":.33}
  93. background_color: 0, 0, 0, 0
  94. font_name: "Poppins-SemiBold"
  95. on_release:
  96. root.signup_request(username_input.text, password_input.text, role_input.text)


我希望整个事情可以运行,但它不能。我尝试了调试和它所显示的是

  1. 'ScreenManager accepts only Screen widget.')


并且还

  1. (<class 'kivy.uix.screenmanager.ScreenManagerException'>, ScreenManagerException('ScreenManager accepts only Screen widget.'), <traceback object at 0x000001548362E048>)


  1. File "C:\Users\User\PycharmProjects\Assignment\main.py", line 47, in build
  2. screen_manager.add_widget(Builder.load_file("signup.kv"))
  3. File "C:\Users\User\PycharmProjects\Assignment\.venv\lib\site-packages\kivy\uix\screenmanager.py", line 988, in add_widget
  4. 'ScreenManager accepts only Screen widget.')
  5. kivy.uix.screenmanager.ScreenManagerException: ScreenManager accepts only Screen widget.


我已经不知道了。我已经检查了类似的问题的解决方案,但问题仍然存在。你是我解决这个问题的最后希望。

mctunoxg

mctunoxg1#

问题是代码:

  1. Builder.load_file("signup.kv")

字符串
返回None,这会在您尝试将其添加到screen_manager时导致错误。上述代码返回None的原因是kv文件包含一个规则<SignUpScreen>:,该规则定义了SignUpScreen应该如何构建。它实际上并没有构建SignUpScreen的示例。您可以通过更改来修复此问题:

  1. <SignUpScreen>:


收件人:

  1. SignUpScreen:

展开查看全部

相关问题