首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tkinter Spinbox Widget在帧间切换时改变大小

Tkinter Spinbox Widget在帧间切换时改变大小
EN

Stack Overflow用户
提问于 2015-08-11 04:34:52
回答 2查看 908关注 0票数 0

我正在创建一个Tkinter应用程序,它在GUI中有一个框架,这些变化取决于用户在程序中所做的事情。它似乎可以在显示的哪个帧之间进行切换。但是,每当您回到它所在的框架时,spinbox小部件就会改变它的大小。我尝试使用固定宽度使用width=5,但仍然遇到同样的问题。我还尝试使用pack()而不是grid()。是什么导致它改变形状,我如何阻止它?

代码语言:javascript
复制
import tkinter as tk
from tkinter import ttk

class ODE_Solver_App(tk.Tk):

    def __init__(self, *args, **kwargs):

        tk.Tk.__init__(self, *args, **kwargs)
        equation_settings = ttk.Frame(self)

        equation_settings.pack(side="top", fill="both", expand = True)

        equation_settings.grid_rowconfigure(0, weight=1)
        equation_settings.grid_columnconfigure(0, weight=1)

        self.frames = {}

        for F in (ODE_Equation_Settings, System_Equation_Settings):

            frame = F(equation_settings, self)

            self.frames[F] = frame

            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame(ODE_Equation_Settings)

        # Buttons in the main class for switching between frames.
        button1 = tk.Button(self, text="ODE Settings", command=lambda: self.show_frame(ODE_Equation_Settings))
        button1.pack()
        button2 = tk.Button(self, text="System Settings", command=lambda: self.show_frame(System_Equation_Settings))
        button2.pack()


    def show_frame(self, cont):

        frame = self.frames[cont]
        frame.tkraise()


class ODE_Equation_Settings(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self,parent)

        equation_profile = tk.Frame(self)  # I am going to have more frames in this class.
        equation_profile.pack()

        order_label = tk.Label(equation_profile, text="Order:")
        order_label.grid(row=0, column=0, sticky="w")
        order_select = tk.Spinbox(equation_profile, width=5, from_=1, to=100000)  # This is the spinbox that is changing in size.
        order_select.grid(row=0, column=1, sticky="e")


class System_Equation_Settings(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        label = tk.Label(self, text="This is Another Page!")
        label.pack(pady=10,padx=10)

        button1 = tk.Button(self, text="This does nothing yet...")
        button1.pack()


app = ODE_Solver_App()
app.mainloop()

我在Yosemite上使用Python 3.4

编辑:我试着在不同的计算机上运行这个程序。结果如下: Mac小牛-同样的问题。Windows (mac上的虚拟机)-工作得很好。

似乎这个问题与我正在使用的操作系统有关。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-11 11:15:44

我认为这是OSX版本的Tkinter中的一个bug。大家都知道它有点多才多艺。我注意到,如果我调整窗口的大小--即使只有一个像素--纺丝盒就会被恢复。这似乎是渲染系统中的一个小故障。

我可以通过删除除可见帧(使用grid_forget)之外的所有帧,然后重新划分应该可见的帧,而不是提升和降低帧,从而获得更好的结果。然而,我仍然看到一个异常现象,只有在我摇动鼠标后才会消失。然而,调用update_idletasks()作为show_frame的最后一步似乎解决了这个问题。

您可以尝试下面的代码来查看它是否更适合您。它的副作用是,每次切换框架时都会调整窗口大小,但您可以通过给主窗口一个足够大的大小来容纳任何一个框架来解决这一问题。

代码语言:javascript
复制
def show_frame(self, cont):

    for frame in self.frames:
        self.frames[frame].grid_forget()
    frame = self.frames[cont]
    self.frames[cont].grid()
    frame.update_idletasks()
票数 2
EN

Stack Overflow用户

发布于 2015-08-11 17:23:55

通过更改一些参数,我设法找到了另一种解决问题的方法。如果更改relife=borderwidth=参数,则spinbox将正常运行。这种方法的唯一缺点是小部件在GUI中看起来不合适,看上去不太吸引人。

但是,还有第二种方法,它涉及将spinbox变成ttk小部件。ttk没有这个小部件,所以您需要制作它。这里的帖子向您展示了如何做到这一点。这是一个很好的解决方法,特别是当您关心GUI的外观时。

*注意:这个问题似乎是Mac的tkinter中的一个缺陷。到目前为止,原始文章中的代码在Windows上运行良好。

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

https://stackoverflow.com/questions/31933298

复制
相关文章

相似问题

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