我试图让这些条目和文本小部件占据其框架中的所有空间,但似乎它们的大小是固定的。网格工具没有帮助。
l = Frame(self, bg=ard)
l.grid(row=0, column = 2, rowspan = 2, columnspan = 3, sticky = ALL)
self.enter = Entry(l, width=100)
self.enter.grid(row=0, column=2, rowspan=1, columnspan=3, sticky=ALL)
self.outro = Text(l, width=100, height=100)
self.outro.grid(row=1, column=2, rowspan=1, columnspan=3, sticky=ALL)
from tkinter import *
import os.path
root = Tk()
ALL = N+S+W+E
buttons = ['Red', 'Blue', 'Green', 'Black', 'Open']
def colorgen():
while True:
yield "red"
yield "blue"
yield "green"
yield "orange"
yield "purple"
color = colorgen()
def coordinates(event):
print("X:{0} Y:{1}".format(event.x, event.y))
class Application(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.master.rowconfigure(0, weight=1)
self.master.columnconfigure(0, weight=1)
self.grid(sticky=ALL)
self.create_widgets()
def create_widgets(self):
for r in range(2):
self.rowconfigure(r, weight=1)
ccount = 0
for c in range(5):
self.columnconfigure(c, weight=1)
ard=next(color)
if c==0:
button0 = Button(self, text=buttons[c], command = lambda: self.changeoutro(0)).grid(row=4, column=c, sticky=ALL)
elif c==1:
button1 = Button(self, text=buttons[c], command = lambda: self.changeoutro(1)).grid(row=4, column=c, sticky=ALL)
elif c==2:
button2 = Button(self, text=buttons[c], command = lambda: self.changeoutro(2)).grid(row=4, column=c, sticky=ALL)
elif c==3:
button3 = Button(self, text=buttons[c], command = lambda: self.changeoutro(3)).grid(row=4, column=c, sticky=ALL)
else:
button = Button(self, text=buttons[c], command = self.opener).grid(row=4, column=c, sticky=ALL)
if c == 0 or c == 1:
l = Frame(self, bg=ard)
l.bind("<Button-1>", coordinates)
l.grid(row=c,column=0, rowspan=1, columnspan=2, sticky=ALL)
elif c == 2:
l = Frame(self, bg=ard)
l.grid(row=0, column = 2, rowspan = 2, columnspan = 3, sticky = ALL)
self.enter = Entry(l, width=100)
self.enter.grid(row=0, column=2, rowspan=1, columnspan=3, sticky=ALL)
self.outro = Text(l, width=100, height=100)
self.outro.grid(row=1, column=2, rowspan=1, columnspan=3, sticky=ALL)
def opener(self):
message = []
fname = self.enter.get()
if os.path.isfile(fname):
f = open(fname, 'r')
for line in f:
message.append(line)
self.outro.insert(1.0, ' '.join(message))
def changeoutro(self, c):
self.outro.config(fg=buttons[c])
app = Application(master=root)
app.mainloop()
答案 0 :(得分:0)
我不确切地知道你要完成什么,所以我无法给出明确的解决方案。但是,我发现了一个常见的错误,或者导致了你所描述的问题。
首先,您正在创建一个框架l
,并且您正在该框架内使用grid
来管理窗口小部件。但是,您不会在该框架内为任何行或列提供权重,因此窗口小部件不会在该框架中使用任何额外的空间。您需要致电rowconfigure
和columnconfigure
,以便为至少一行和一列提供正权重。
请注意,如果此框架只包含一个条目和一个文本,则对于此特定框架,使用pack
而不是grid
会更容易一些。您可以将条目打包到顶部,将文本打包到底部,您不必担心列权重:
self.enter.pack(side="top", fill="x", expand=False)
self.outro.pack(side="bottom", fill="both", expand=True)
其次,您可能会误解tkinter的工作原理。您告诉条目小部件跨越两行和三列,但该父小部件(l
)只有一列,只有两行。使用网格行和列时,只应用 直接父窗口。如果您的GUI作为一个整体有多个行和/或列并不重要,当您在l
中放置内容时,行和列仅相对于l
中的行和列。
换句话说,没有理由在columnspan
内使用l
,因为只有一列,并且出于同样的原因,将条目和文本小部件放在第2列中是没有意义的。< / p>