我肯定会误解包装和网格的东西...... 我正在为一个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()
答案 0 :(得分:0)
首先,为什么我需要打包按钮框才能显示它? 网格不应该等同于打包吗?
不,一般来说,您不需要打包按钮框就可以显示它。在同一个小部件上使用包或网格,但不能同时使用它们。但是,在这种特定情况下,使用pack
掩码会在代码中发生更深层次的错误,并且似乎需要调用pack
。
问题是您对pack
使用self.consoleFrame
,而self.consoleFrame
和self.buttonFrame
都有相同的父级。因为它们共享同一个父级,所以必须使用包或网格。
GUI由按钮框架顶部的一系列按钮和a组成 下面列出的系列垂直控制台。相反,什么 我得到的是所有控制台垂直堆放。
这是因为您使用grid
,然后使用pack
。你只能使用其中一个,而你使用的最后一个“胜利”。因此,您正在使用pack
,并且您没有给它任何选项,因此它默认是从上到下打包。
虽然在同一个应用程序中同时使用grid
和pack
是完全安全的,但在同一个小部件上同时使用它们是没有意义的,对于共享相同的小部件使用不同的小部件是错误的父节点。
问题的解决方案与您对grid
和pack
的使用保持一致。如果您打算使用grid
,请确保对共享同一父级的所有窗口小部件一致地使用它。
同样适用于pack
- 始终如一地使用它。另外,我建议始终将side
,fill
和expand
参数明确添加到pack
,以便明确您的意图。