【问题标题】:How to add new widget in GridLayout without resizing older widgets?如何在 GridLayout 中添加新小部件而不调整旧小部件的大小?
【发布时间】:2019-05-31 01:46:53
【问题描述】:

我已将 GridLayout 添加到 ScrollView,并且我正在从 python 程序动态地在 GridLayout 中添加小部件。而不是使用更多的窗口空间,它正在调整旧小部件的高度。我在这里做错了什么?

我尝试将 BoxLayout 放在 GridLayout 中,但它不起作用。 我也尝试将小部件直接添加到 ScrollView 但我发现 ScrollView 只支持一个小部件。

我的kv码:

<Downloading>:
    my_grid: mygrid
    GridLayout:
        cols: 1
        size_hint_y : None
        hight: self.minimum_height
        id: mygrid

我的python代码:

class Downloading(ScrollView):
    set_text = ObjectProperty()
    my_grid = ObjectProperty()

    def __init__(self, select, link, path, username, password):

        self.select = select
        self.link = link
        self.path = path
        self.username = username
        self.password = password
        self.p_bar = []
        self.stat = []

        self.parent_conn, self.child_conn = Pipe()

        p = Process(target=main, args=(self.child_conn, self.select,
                                       self.link, self.path,
                                       self.username, self.password))
        p.start()

        super().__init__()

        self.event = Clock.schedule_interval(self.download_GUI, 0.1)

    def newFile(self, title):
        # self.newId = "stat" + str(len(self.p_bar) + 1)
        self.stat.append(Label(text=''))
        self.p_bar.append(ProgressBar())
        self.my_grid.add_widget(Label(text=title))
        self.my_grid.add_widget(self.stat[-1])
        self.my_grid.add_widget(self.p_bar[-1])

    def download_GUI(self, a):

        temp = self.parent_conn.recv()

        print(temp)

        if temp == "new":
            self.downloading = True
            return
        if self.downloading:
            self.newFile(temp)
            self.downloading = False
            return
        if type(temp) == type({}):
            self.complete = temp['complete']
            if not self.complete:
                status = "{0}//{1} @ {2}  ETA: {3}".format(temp['dl_size'],
                                                      temp['total_size'],temp['speed'],temp['eta'])
                self.stat[-1].text = status
                self.p_bar[-1].value = temp['progress']
                return

        if temp == "end":
            self.event.cancel()
            Clock.schedule_once(exit, 3)

【问题讨论】:

    标签: python python-3.x kivy


    【解决方案1】:

    我相信您只需为添加到GridLayout 的每个小部件设置高度。例如:

        self.my_grid.add_widget(Label(text=title, size_hint=(1, None), height=50))
    

    您可能需要对要添加的其他小部件执行相同操作。 GridLayout 可能会给最初添加的小部件更多的空间,但不会比您指定的height 更紧。

    【讨论】:

    • 添加初始高度后,GridLayout 不会挤压前一个小部件,但溢出后 Scrollview 不再工作。
    • 您的kv 文件中有错字:hight: 应该是height:
    【解决方案2】:

    对 kv 文件应用以下更改后

    <Downloading>:
        size: self.size
        my_grid: mygrid
        GridLayout:
            cols: 1
            size_hint_y : None
            row_default_height: '25dp'
            row_force_default: True
            id: mygrid
    

    并将这一行添加到构造函数的末尾(__init__),它按预期工作。

    self.my_grid.bind(minimum_height=self.my_grid.setter('height'))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-14
      • 1970-01-01
      • 2011-11-03
      • 2016-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多