【问题标题】:Is there a way to implement this tkinter code snippet using place() method instead of pack()?有没有办法使用 place() 方法而不是 pack() 来实现这个 tkinter 代码片段?
【发布时间】:2022-12-17 11:25:58
【问题描述】:

问题:我想使用 place 方法,因为它允许 我使用 relx/rely 属性将内容放置在窗口中。因为我在这里使用 tk.Frame,所以我不能使用 place 方法(或者至少我不知道你可以)。还有另一种方法吗?我想使用 place 方法,因为这样放置内容对我来说更容易。代码如下:


import tkinter as tk

class App(tk.Frame):

    def __init__(self, master):
        
        tk.Frame.__init__(self, master)
        
        
        weightList = ["kilogram", "pound", "ounze"]
        distanceList = ["kilometers", "meters", "miles", "yards"]
        temperatureList = ["celsius", "fahrenheit", "kelvin"]
    
    
        self.dict = {'weight': weightList,
                     'distance': distanceList,
                     'temperature': temperatureList}
       
        
        self.variable_a = tk.StringVar(self)
        self.variable_b = tk.StringVar(self)
    
        self.variable_a.trace('w', self.update_options)
    
        self.optionmenu_a = tk.OptionMenu(self, self.variable_a, *self.dict.keys())
        self.optionmenu_b = tk.OptionMenu(self, self.variable_b, '')
    
        self.variable_a.set('weight')
        
        
        self.optionmenu_a.pack()
        self.optionmenu_b.pack()
        self.pack()
        
        
       
    
    def update_options(self, *args):
        Units = self.dict[self.variable_a.get()]
        self.variable_b.set(Units[0])
    
        menu = self.optionmenu_b['menu']
        menu.delete(0, 'end')
    
        for i in Units:
            menu.add_command(label=i, command=lambda current=i: self.variable_b.set(current))

win = tk.Tk()
win.title("Unit Converter")
win.geometry("500x300")
win = App(win)
win.mainloop()

如果我用 place 替换 pack,下拉小部件将不会出现:

import tkinter as tk



class App(tk.Frame):

    def __init__(self, master):
        
        tk.Frame.__init__(self, master)
        
        
        weightList = ["kilogram", "pound", "ounze"]
        distanceList = ["kilometers", "meters", "miles", "yards"]
        temperatureList = ["celsius", "fahrenheit", "kelvin"]


        self.dict = {'weight': weightList,
                     'distance': distanceList,
                     'temperature': temperatureList}
       
        
        self.variable_a = tk.StringVar(self)
        self.variable_b = tk.StringVar(self)

        self.variable_a.trace('w', self.update_options)

        self.optionmenu_a = tk.OptionMenu(self, self.variable_a, *self.dict.keys())
        self.optionmenu_b = tk.OptionMenu(self, self.variable_b, '')

        self.variable_a.set('weight')
        
        
        self.optionmenu_a.place(relx = 0.35, rely = 0.1)
        self.optionmenu_b.place(relx = 0.75, rely = 0.1)
        self.pack()
        
        
       

    def update_options(self, *args):
        Units = self.dict[self.variable_a.get()]
        self.variable_b.set(Units[0])

        menu = self.optionmenu_b['menu']
        menu.delete(0, 'end')

        for i in Units:
            menu.add_command(label=i, command=lambda current=i: self.variable_b.set(current))



win = tk.Tk()
win.title("Unit Converter")
win.geometry("500x300")
win = App(win)
win.mainloop()

我尝试单独使用 place 方法,但它不起作用(place 而不是 pack,仅具有 relx/rely 属性)。 我尝试使用 tk.Frame 查找解决方案,但我不明白该怎么做(不知道如何为两者指定宽度/高度)。除此之外,我在理解 tk.Frame 如何与我的代码交互时也遇到了问题(tkinter 的新功能)。

【问题讨论】:

    标签: python user-interface tkinter


    【解决方案1】:

    如果我用 place 替换 pack,下拉小部件将不会出现:

    这是因为使用 place 不会强制调整包含的小部件的大小以使其足够大以容纳其所有子部件。因为您没有给初始框架一个尺寸,也因为您没有强制它填充自己的容器,所以框架的尺寸默认为 1x1。它就在那里,但几乎看不见。

    针对此示例的一个简单解决方案是强制框架填充分配给它的空间:

    self.pack(fill="both", expand=True)
    #         ^^^^^^^^^^^^^^^^^^^^^^^^
    

    如果你不想让它填满整个空间,你需要告诉 tkinter 框架有多大:

    class App(tk.Frame):
        def __init__(self, master):
            tk.Frame.__init__(self, master, width=300,  height=200)
            #                             ^^^^^^^^^^^^^^^^^^^^^^^^
            ...
    

    这就是为什么 place 很少使用的原因之一。 Tkinter 非常擅长管理小部件的大小。如果您使用place,大小和位置完全由您决定,并且制作响应式用户界面(那些适用于各种分辨率、具有不同字体并且在调整窗口大小时表现正常的用户界面)变得更加困难).

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多