帧的Tkinter网格垂直堆叠而不是水平堆叠

时间:2014-06-20 17:19:10

标签: python grid tkinter pack

我肯定会误解包装和网格的东西...... 我正在为一个python应用程序制作GUI,它可以在多个类似终端的控制台中获取调试消息。制作Tkinter GUI是

的新功能

首先,为什么我需要打包按钮框才能显示它?网格不应该等同于打包吗?

GUI由按钮框架顶部的一系列按钮和下面的一系列垂直控制台组成。相反,我得到的是所有控制台垂直堆叠。

控制台是带有文本的框架,其中的文本由应用程序中的其他线程编写。

如果我不对控制台[idx]进行网格化,它不会改变(所以我认为它不起作用)。如果我不打包控制台[idx],GUI就会开始闪烁。

请注意,如果我改为调用create_Hterms,而是垂直堆叠一堆水平控制台。

如何正确将控制台作为垂直列?

import Tkinter as tikei

NCONSOLES = 4
HORZ_CONSOLE_W = 10
HORZ_CONSOLE_H = 12

# FakeConsole: one of the consoles that are spawned by MainWindow.
class FakeConsole(tikei.Frame): # from Kevin in http://stackoverflow.com/questions/19479504/how-can-i-open-two-consoles-from-a-single-script
    def __init__(self, root, cust_width, cust_height, *args, **kargs):
        tikei.Frame.__init__(self, root, *args, **kargs)
        self.grid(row=0)

        #white text on black background
        self.text = tikei.Text(root, bg="black", fg="white", width=cust_width, height=cust_height)
        self.text.grid(row=0)
        self.text.insert(tikei.END, 'ASD')
        self.text.see(tikei.END)

    def clearConsole(self):
        self.text.delete(1.0,tikei.END)



class MainWindow(tikei.Frame):
    counter = 0
    consoles = []
    consoleFormat = ''
    e_Vvar = ''
    e_Hvar = ''
    var1 = ''
    ctrlCmdRecipient = ''

    def __init__(self, *args, **kwargs):
        tikei.Frame.__init__(self, *args, **kwargs)
        self.consoleFormat = 'H'
        self.cF = tikei.StringVar()

        self.grid(row=0)

        self.buttonframe = tikei.Frame(self)
        self.buttonframe.grid(row=0)
        tikei.Button(self.buttonframe, text = "Clear Consoles", command=self.clearConsoles).grid(row=0, column=0)
        tikei.Button(self.buttonframe, text = "start").grid(row=0, column=1)
        tikei.Button(self.buttonframe, text = "stop").grid(row=0, column=2)

        self.consoleFrame = tikei.Frame(self)

        self.create_Hterms()

        self.consoleFrame.grid(row=1)

        # create a status bar
        self.statusTxt = tikei.StringVar()
        self.statusTxt.set('-')
        self.statusLab = tikei.Label(self.buttonframe, text="Status: ", anchor=tikei.W, height=1).grid(row=1, column=0, sticky=tikei.W)
        self.statusBar = tikei.Label(self.buttonframe, textvariable=self.statusTxt, anchor=tikei.W, height=1).grid(row=1, column=1, columnspan=4, sticky=tikei.W)


    def clearConsoles(self):
        for i in range(NCONSOLES):
            self.consoles[i].clearConsole()

    def create_Hterms(self):
        ctr = NCONSOLES
        idx = 0

        cons_w = HORZ_CONSOLE_W
        cons_h = HORZ_CONSOLE_H

        while ctr > 0:
            self.consoles.append(FakeConsole(self.consoleFrame, cons_w, cons_h)) # 
            self.consoles[idx].grid(row=idx+1, column=0)
            ctr -= 1
            idx += 1
        return idx+1



root = tikei.Tk()
mainTk = MainWindow(root)
root.wm_title("TOOLS")
mainTk.grid(row=0)
root.mainloop()

1 个答案:

答案 0 :(得分:0)

  

首先,为什么我需要打包按钮框才能显示它?   网格不应该等同于打包吗?

不,一般来说,您不需要打包按钮框就可以显示它。在同一个小部件上使用包或网格,但不能同时使用它们。但是,在这种特定情况下,使用pack掩码会在代码中发生更深层次的错误,并且似乎需要调用pack

问题是您对pack使用self.consoleFrame,而self.consoleFrameself.buttonFrame都有相同的父级。因为它们共享同一个父级,所以必须使用包或网格。

  

GUI由按钮框架顶部的一系列按钮和a组成   下面列出的系列垂直控制台。相反,什么   我得到的是所有控制台垂直堆放。

这是因为您使用grid,然后使用pack。你只能使用其中一个,而你使用的最后一个“胜利”。因此,您正在使用pack,并且您没有给它任何选项,因此它默认是从上到下打包。

虽然在同一个应用程序中同时使用gridpack是完全安全的,但在同一个小部件上同时使用它们是没有意义的,对于共享相同的小部件使用不同的小部件是错误的父节点。

问题的解决方案与您对gridpack的使用保持一致。如果您打算使用grid,请确保对共享同一父级的所有窗口小部件一致地使用它。

同样适用于pack - 始终如一地使用它。另外,我建议始终将sidefillexpand参数明确添加到pack,以便明确您的意图。

相关问题