Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 通行证;关于“U启动数据”;要创建MyScreen和MyImage,需要ScreenManager中的屏幕名称_Python_Python 3.x_Kivy - Fatal编程技术网

Python 通行证;关于“U启动数据”;要创建MyScreen和MyImage,需要ScreenManager中的屏幕名称

Python 通行证;关于“U启动数据”;要创建MyScreen和MyImage,需要ScreenManager中的屏幕名称,python,python-3.x,kivy,Python,Python 3.x,Kivy,我正在使用Kivy库创建一个主要使用Python代码的应用程序。我是Python和Kivy的新手。这里是我的一些代码片段 我试图将定义为“启动”的图像传递给导航按钮@ikolim帮我找出了问题所在。你可以在下面看到我的评论 小部件 class NavButton(GridLayout): def __init__(self, **kwargs): super(NavButton, self).__init__(**kwargs) self.rows =

我正在使用Kivy库创建一个主要使用Python代码的应用程序。我是Python和Kivy的新手。这里是我的一些代码片段

我试图将定义为“启动”的图像传递给导航按钮@ikolim帮我找出了问题所在。你可以在下面看到我的评论

小部件

class NavButton(GridLayout):

    def __init__(self, **kwargs):
        super(NavButton, self).__init__(**kwargs)
        self.rows = 1
        frame = FloatLayout(id = "frame")
        grid1 = MyGrid(
            rows = 1,
            cols = 5,
            pos_hint = {"top":1, "left": 1},
            size_hint = [1, .2]                         )
        grid1.set_background(0.95,0.95,0.95,1)

        grid1.add_widget(MyButton(
            source = "img/settings.png",
            size_hint = [0.2,0.2]                       ))
        grid1.add_widget(MyButton(
            source = "img/arrow-left.png"               ))
        city_icon = Image(
            source="img/image1.png",
            id="city_icon",
            size_hint=[0.8, 0.8])

        self.ids.cityicon = city_icon
        grid1.add_widget(city_icon)
        grid1.add_widget(MyButton(
            source = "img/arrow-right.png"              ))
        grid1.add_widget(MyButton(
            source = "img/globe.png",
            size_hint = [0.2,0.2]                       ))
        frame.add_widget(grid1)
        self.add_widget(frame)
屏风 屏幕管理器 这就是我搞砸的地方!显然,您必须定义主屏幕的名称(即
homescreen=homescreen(name=“home\u screen”)
),否则启动应用程序时,它不会更新导航按钮的图像。我不知道为什么,但我只是想为未来的程序员强调一下这一点

 class MyScreenManager(ScreenManager):

        def __init__(self, **kwargs):
        super(MyScreenManager, self).__init__(**kwargs)
        homescreen = Homescreen()
        self.add_widget(homescreen)
        self.ids.screenmanager =  self

    def change_screen(self, name):
         self.current = name
建设者 @ikolim再次感谢您的支持。

解决方案2 要解决此问题,需要以下增强功能

类NavButton()
  • 替换self.ids.cityicon=“cityicon” 带有
    self.ids.cityicon=city\u图标
  • 删除
    self.bind(on_start=self.update_image)
    和方法
    update_image()
  • 启动()时的方法
  • 更换
    主屏幕=
    Main.get\u running\u app().root.get\u screen(“主屏幕”)
    with
    homescreen=self.root.get\u screen(“主屏幕”)
  • 替换
    frame.children[3]。children[0]。children[0]。children[2]。源代码
    with
    homescreen.ids.navbutton.ids.cityicon.source
  • 删除行(
    frame=homescreen.children[0]
    navbutton=
    frame.children[3]
    ,和
    打印(…)
  • 代码片段-py文件 示例-main.py 输出

    解决方案1
    • 使用函数获取应用程序的实例
    • self
      添加到
      my_city
    代码片段-py文件
    通过setter方法更改变量就足够了,还是要在构造函数中“更改”此图片?因为如果你想在构造器中使用变量,只需将变量my_city设为全局变量。。。也许有更好的方法,但我认为这是最简单的。不工作。。。也许我做错了什么。仍在寻找解决方法。。。也许有一个绑定函数。。。不知道如何使用它,但是…你有没有收到任何错误?请在Google Drive或GitHubIs中共享您更新的应用程序。图片是数据库中的“it Rome”,数据类型是什么,BLOB?请参阅更新的帖子了解解决方案2的详细信息。您好@ikolim,我更新了代码,但没有更改。我很高兴看到它在你们的终端上工作。有没有可能是别的地方出了问题?这里是链接
     class MyScreenManager(ScreenManager):
    
            def __init__(self, **kwargs):
            super(MyScreenManager, self).__init__(**kwargs)
            homescreen = Homescreen()
            self.add_widget(homescreen)
            self.ids.screenmanager =  self
    
        def change_screen(self, name):
             self.current = name
    
    GUI = Builder.load_file("main.kv")
    
    class Main(App):
    
        def build(self):
            return GUI
    
        def on_start(self):
    
            self.mynewimage = "image2"
            homescreen = self.root.get_screen("home_screen")
            homescreen.ids.navbutton.ids.cityicon.source = f"img/{self.mynewimage}.png"
    
    
    if __name__ == "__main__":
        Main().run()
    
    class NavButton(GridLayout):
    
        def __init__(self, **kwargs):
            super(NavButton, self).__init__(**kwargs)
            ...
            city_icon = Image(
                source="img/settings.png",
                id="city_icon",
                size_hint=[0.8, 0.8])
    
            self.ids.cityicon = city_icon
            ...
    
    
    class Main(App):
    
        ...
    
        def on_start(self):
            self.my_city = "it-Rome"
            homescreen = self.root.get_screen("home_screen")
            homescreen.ids.navbutton.ids.cityicon.source = f"img/{self.my_city}.png"
        ...
    
    from kivy.app import App
    from kivy.uix.screenmanager import ScreenManager, Screen
    from kivy.uix.gridlayout import GridLayout
    from kivy.uix.floatlayout import FloatLayout
    from kivy.uix.button import ButtonBehavior
    from kivy.uix.label import Label
    from kivy.uix.image import Image
    from kivy.graphics import Color, Rectangle
    
    
    class MyButton(ButtonBehavior, Image):
        pass
    
    
    class ImageButton(ButtonBehavior, Image):
        pass
    
    
    ### Components
    
    class NavButton(GridLayout):
    
        def __init__(self, **kwargs):
            super(NavButton, self).__init__(**kwargs)
            self.rows = 1
            frame = FloatLayout(id="frame")
            grid1 = MyGrid(
                rows=1,
                cols=5,
                pos_hint={"top": 1, "left": 1},
                size_hint=[1, .2])
            grid1.set_background(0.95, 0.95, 0.95, 1)
    
            grid1.add_widget(MyButton(
                source="img/settings.png",
                size_hint=[0.2, 0.2]))
            grid1.add_widget(MyButton(
                source="img/arrow-left.png"))
            city_icon = Image(
                source="img/settings.png",
                id="city_icon",
                size_hint=[0.8, 0.8])
    
            self.ids.cityicon = city_icon
    
            grid1.add_widget(city_icon)
            grid1.add_widget(MyButton(
                source="img/arrow-right.png"))
            grid1.add_widget(MyButton(
                source="img/globe.png",
                size_hint=[0.2, 0.2]))
            frame.add_widget(grid1)
            self.add_widget(frame)
    
    
    ### Grids
    
    class MyGrid(GridLayout):
    
        def set_background(self, r, b, g, o):
            self.canvas.before.clear()
            with self.canvas.before:
                Color(r, g, b, o)
                self.rect = Rectangle(pos=self.pos, size=self.size)
    
            self.bind(pos=self.update_rect,
                      size=self.update_rect)
    
        def update_rect(self, *args):
            self.rect.pos = self.pos
            self.rect.size = self.size
    
    
    ### Screens
    
    class Homescreen(Screen):
    
        def __init__(self, **kwargs):
            super(Homescreen, self).__init__(**kwargs)
            frame = FloatLayout(id="frame")
            grid1 = NavButton()
            frame.add_widget(grid1)
    
            # This grid contains the number of zpots collected
    
            grid2 = MyGrid(
                cols=1,
                pos_hint={"top": 0.8, "left": 1},
                size_hint=[1, .2], )
            grid2.add_widget(Image(
                source="img/spot.png"))
            grid2.add_widget(Label(
                text="[color=3333ff]20/30[/color]",
                markup=True))
            grid2.set_background(0.95, 0.95, 0.95, 1)
            frame.add_widget(grid2)
    
            # This grid contains a scrollable list of nearby zpots
    
            grid3 = MyGrid(
                cols=1,
                pos_hint={"top": 0.6, "left": 1},
                size_hint=[1, .5])
            grid3.set_background(0.95, 0.95, 0.95, 1)
            frame.add_widget(grid3)
    
            # This grid contains a the map of nearby zpots
    
            grid4 = MyGrid(
                cols=1,
                pos_hint={"top": 0.1, "left": 1},
                size_hint=[1, .1])
            grid4.set_background(0.95, 0.95, 0.95, 1)
            frame.add_widget(grid4)
            self.ids.navbutton = grid1
            self.add_widget(frame)
    
    
    class Newscreen(Screen):
        pass
    
    
    class Settingscreen(Screen):
        pass
    
    
    ### ScreenManager
    
    class MyScreenManager(ScreenManager):
    
        def __init__(self, **kwargs):
            super(MyScreenManager, self).__init__(**kwargs)
            homescreen = Homescreen(name='home_screen')
            self.add_widget(homescreen)
            self.ids.screenmanager = self
    
        def change_screen(self, name):
            self.current = name
    
    
    class TestApp(App):
    
        def build(self):
            return MyScreenManager()
    
        def on_start(self):
            self.my_city = "it-Rome"
            homescreen = self.root.get_screen("home_screen")
    
            print(f"\non_start-Before change: img={homescreen.ids.navbutton.ids.cityicon.source}")
            homescreen.ids.navbutton.ids.cityicon.source = f"img/{self.my_city}.png"
            print(f"\non_start-After change: img={homescreen.ids.navbutton.ids.cityicon.source}")
    
    
    if __name__ == "__main__":
        TestApp().run()
    
    class NavButton(GridLayout):
    
        def get(self):
            ...
            city_icon = Image(
                    source = "img/" + App.get_running_app().my_city,
                    size_hint = [0.8,0.8]                       )
    
    ...
    class Main(App):
    
        def build(self):
            return GUI
    
        def on_start(self):
            # get data from DB
            self.my_city = "it-Rome"