首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用网格管理器设置高度

用网格管理器设置高度
EN

Stack Overflow用户
提问于 2018-10-04 18:14:13
回答 1查看 569关注 0票数 0

我正在尝试使用Tkinter和Python构建简单的GUI应用程序。应用程序应该或多或少地类似于这一点。

代码语言:javascript
运行
复制
------------------------------
Label-1 | Canvas-1
------------------------------
Label-2 | Canvas-2
------------------------------
Label-3 | Canvas-3
------------------------------
 . . .
Label-3 | Canvas-3
------------------------------
        | scrollbar-horizontal
------------------------------

其中滚动条应该同时滚动所有Canvas对象。这部分我可以完成,但我面临的问题,当我试图为每一行设定高度。基本上,我希望在另一行下有预定义的高度。我决定使用网格管理器来实现这一点。

下面是一个很小的例子:

代码语言:javascript
运行
复制
import tkinter
import tkinter.font


class LineData(object):

    def __init__(self, desc, box):
        self.desc = desc
        self.box = box

class LinePlotter(object):

    def __init__(self, label, canvas, desc, box):
        self.label = label
        self.canvas = canvas
        self.desc = desc
        self.box = box

    def plot(self):
        self.label.set(self.desc)
        x1, y1 = self.box[0], 1
        x2, y2 = self.box[1], 20
        print(self.desc)
        print(x1, y1, x2, y2)
        print(x2+100, y1, x2+(x2-x1)+100, y2)
        self.canvas.create_rectangle(x1, y1, x2, y2, outline="#D1D0CE", 
                                     width=4, fill="#D1D0CE")

        self.canvas.create_rectangle(x2+100, y1, x2+(x2-x1)+100, y2, outline="#D1D0CE",
                                     width=4, fill="#D1D0CE")


class Plotter(tkinter.Frame):

    def __init__(self, parent, lines_data):
        super().__init__(parent)
        self.parent = parent
        self.lines_data = lines_data

    def set_scroll_bar(self):
        x1, y1, x2, y2 = self.canvases[0].bbox(tkinter.ALL)
        x1 = y1 = 0
        for c in self.canvases:
            t1, u1, t2, u2 = c.bbox(tkinter.ALL)
            x1 = min(x1, t1)
            x2 = max(x2, t2)
            y1 = min(y1, u1)
            y2 = max(y2, u2)

        print("final=", x1, y1, x2, y2)
        for c in self.canvases:
            c.config(scrollregion=(x1-5, y1-5, x2+5, y2+5))

    def xview(self, *args):
        for c in self.canvases:
            c.xview(*args)

    def initUI(self):

        self.scrollX = tkinter.Scrollbar(self, orient=tkinter.HORIZONTAL)

        self.scrollX['command'] = self.xview
        self.scrollX.grid(row=2, column=1, sticky='NSEW')

        self.canvases = []

        h = 10
        for row_idx, line_data in enumerate(self.lines_data):
            desc = tkinter.StringVar()
            font = tkinter.font.Font(size=11)
            label = tkinter.Label(self, textvariable=desc, font=font, 
                                  height=h)
            label.grid(row=row_idx, column=0, sticky=tkinter.W)

            canvas = tkinter.Canvas(self, bg='white', 
                                    xscrollcommand=self.scrollX.set, 
                                    height=h)

            line = LinePlotter(desc, canvas, line_data.desc, line_data.box)
            line.plot()

            canvas.grid(row=row_idx, column=1, sticky=tkinter.W)
            self.canvases.append(canvas)

        self.set_scroll_bar()

        self.pack(expand=True, fill=tkinter.X)


l1 = LineData("L1", (50, 60))
l2 = LineData("L2", (200, 250))

root = tkinter.Tk()

Plotter(root, [l1, l2]).initUI()
root.mainloop()  

当我在h = None中设置initUI时,我看到对象正在扩展到整个窗口。

当我设置h = 10时,我看到行正在变薄,但它们一直分布在屏幕上。

当我设置h = 50时,我只看到第一行。

理想情况下,我希望看到类似于h = 10的东西,但在另一行下。我怎样才能做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-04 19:51:58

您的问题是,h在创建画布时表示像素,但在配置标签时表示行数。用它来做一个或另一个,但不是两者都用。

假设您希望画布高10像素,只需从标签中移除高度即可。这将使标签尽可能小。它仍将高于10像素,但您可以通过选择一个较小的字体来修复这个问题。

当我简单地从标签中删除height=h时,我的结果是:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52653065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档