【问题标题】:How do I create a certain ratio of row heights in a PySimpleGUI element?如何在 PySimpleGUI 元素中创建一定比例的行高?
【发布时间】:2021-09-30 05:57:44
【问题描述】:

我正在使用 PySimpleGUI 为应用程序创建前端。

作为界面的一部分,我在 Tab 元素上垂直排列了两个元素:一个 Table 和一个 Canvas。

我希望两个元素水平填充整个空间,但我希望表格垂直占据空间的 2/3,而画布占据另外 1/3。我尝试了各种方法来扩展和调整元素的大小,但它们都不可避免地占据了垂直空间的一半。

我正在 Windows 上开发应用程序,我相信底层工具包是 TK,所以也许有一种较低级别的方法可以工作。

感谢您的想法和建议。

【问题讨论】:

    标签: tkinter tk pysimplegui


    【解决方案1】:

    参考Tkinter Pack() setting a ratio for expanding

    pack方法构建的PySimpleGUI下无法实现。

    这是在 PySimpleGUI 下将几何管理器从 pack 更改为 grid 的黑客方法,但可见/不可见选项将不再起作用。

    import PySimpleGUI as sg
    
    headings = ['President', 'Date of Birth']
    data = [
        ['Ronald Reagan', 'February 6'],
        ['Abraham Lincoln', 'February 12'],
        ['George Washington', 'February 22'],
        ['Andrew Jackson', 'March 15'],
        ['Thomas Jefferson', 'April 13'],
        ['Harry Truman', 'May 8'],
        ['John F. Kennedy', 'May 29'],
        ['George H. W. Bush', 'June 12'],
        ['George W. Bush', 'July 6'],
        ['John Quincy Adams', 'July 11'],
        ['Garrett Walker', 'July 18'],
        ['Bill Clinton', 'August 19'],
        ['Jimmy Carter', 'October 1'],
        ['John Adams', 'October 30'],
        ['Theodore Roosevelt', 'October 27'],
        ['Frank Underwood', 'November 5'],
        ['Woodrow Wilson', 'December 28'],
    ]
    
    size = (480, 320)
    
    font = ('Courier New', 11)
    sg.theme('DarkBlue3')
    sg.set_options(font=font)
    
    layout = [
        [sg.Table(data, headings=headings, justification='left', expand_x=True, expand_y=True, key='-TABLE-')],
        [sg.Graph(size, (0, 0), size, background_color='green', expand_x=True, expand_y=True, key='-GRAPH-')],
    ]
    
    window = sg.Window('Title', layout, resizable=True, finalize=True)
    height = window['-TABLE-'].Widget.winfo_reqheight()//2
    window['-GRAPH-'].Widget.configure(height=height)
    width = window['-GRAPH-'].CanvasSize[0]
    window['-GRAPH-'].CanvasSize = (width, height)
    table = window['-TABLE-'].Widget.master.master
    table.pack_forget()
    graph = window['-GRAPH-'].Widget.master
    graph.pack_forget()
    table.grid(row=0, column=0, sticky=sg.tk.NSEW)
    graph.grid(row=1, column=0, sticky=sg.tk.NSEW)
    root = table.master
    root.rowconfigure(0, weight=2)
    root.rowconfigure(1, weight=1)
    root.columnconfigure(0, weight=1)
    # Size of Graph changed, maybe you need to update following arguments
    # window['-GRAPH-'].change_coordinates(graph_bottom_left, graph_top_right)
    window.read(close=True)
    

    如果窗口不能调整大小,会容易得多,只需使用语句window = sg.Window(...)中的以下代码

    window = sg.Window('Title', layout, finalize=True)
    height = window['-TABLE-'].Widget.winfo_reqheight()//2
    window['-GRAPH-'].Widget.configure(height=height)
    width = window['-GRAPH-'].CanvasSize[0]
    window['-GRAPH-'].CanvasSize = (width, height)
    # Size of Graph changed, maybe you need to update following arguments
    # window['-GRAPH-'].change_coordinates(graph_bottom_left, graph_top_right)
    window.read(close=True)
    

    【讨论】:

    • 非常感谢您的回复!不幸的是,在解释这个问题时,我没有提到我的 Tab 元素,作为 TabGroup 的一部分,是 Column 元素的一部分。我认为这在使用您提出的解决方案时会导致错误:“_tkinter.TclError: cannot use geometry manager grid inside .!toplevel.!frame3.!panedwindow.!frame2.!frame2.!notebook.!frame2 which has been slaves由包管理”。有解决办法吗?
    • 这里 widget.master 下的所有小部件都应该使用相同的几何管理器。找出相同的主小部件,然后 pack_forget 所有子小部件,然后 grid 他们回来。例如table.!toplevel.!framegraph.!toplevel.!frame2,它们有相同的主或父,.!toplevel,它只有两个子部件.!toplevel.!frame.!toplevel.!frame2,所以pack_foget全部其中,然后grid 全部返回。任何仍然打包的小部件,您不能对其他小部件进行网格化。
    • 如果窗口不可调整大小则更新。
    • 谢谢!我会试试看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-05
    • 1970-01-01
    • 1970-01-01
    • 2012-02-26
    • 2018-05-21
    • 2017-07-25
    • 1970-01-01
    相关资源
    最近更新 更多