我对自己面临的问题感到非常困惑。我花了一些时间来尽力解决这个问题,这里是:
我正在使用tkinter和ttk,我想创建一个按钮网格,就像下面的代码一样:(取自https://www.edureka.co/community/1539/tkinter-grid-overlapping-issue) TL; DR:只是一个工作日历,每天在网格中都有一个按钮
from calendar import *
import datetime
try:
from tkinter import * # Python 3.x
except:
from Tkinter import * # Python 2.x
class Application(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.grid(row=0, column=0, sticky='news')
DateNow = datetime.datetime.now()
month = int(DateNow.month)
year = int(DateNow.year)
self.createDaysOfWeekLabels()
month_name = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
# Create frames and button controls for previous, current and next month.
self.frameList = [] # List that contains the frame objects.
self.buttonList = [] # List that contains the button objects.
amonth = month - 1
for i in range(3):
if amonth < 0:
amonth = 11
year -= 1
elif amonth == 12:
amonth = 1
year += 1
mFrame = Frame(self)
self.createMonth(mFrame, amonth, year)
self.frameList.append(mFrame)
mButton = Button(self, text=month_name[amonth-1])
mButton['command'] = lambda f=mFrame, b=mButton: self.showMonth(f, b)
mButton.grid(row=0, column=i)
# Grid each frame
mFrame.grid(row=2, column=0, columnspan=7, sticky='news')
if (i == 1):
mButton['relief'] = 'flat'
else:
# Remove all but the ith frame. More efficient to remove than forget and configuration is remembered.
mFrame.grid_remove()
self.buttonList.append(mButton)
amonth += 1
# Create year widget at top left of top frame
label = Label(self, text=year)#displaying year
label.grid(row=0, column=6)
def createDaysOfWeekLabels(self):
days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
for i in range(7):
label = Label(self, text=days[i])
label.grid(row = 1, column = i)
def showMonth(self, mFrame, mButton):
# Display all buttons normally
for button in self.buttonList:
button['relief'] = 'raised'
# Set this month's button relief to flat
mButton['relief'] = 'flat'
# Hide all frames
for frame in self.frameList:
frame.grid_remove()
mFrame.grid()
def createMonth(self, mFrame, month, year):
weekday, numDays = monthrange(year, month)
week = 0
for i in range(1, numDays + 1):
button = Button(mFrame, text = str(i), width=3)
button.grid(row = week, column = weekday)
weekday += 1
if weekday > 6:
week += 1
weekday = 0
mainWindow = Tk()
obj = Application(mainWindow)
mainWindow.mainloop()
然后我尝试做类似的事情,但是使用字典,其键是坐标元组,值是按钮(以父帧为框架),像这样:
coords = {(0, 0):ttk.Button(self.frame_p1g), (0, 1): ttk.Button(self.frame_p1g)}
我刚刚对我的网格使用了同样的字典,下面的代码很完美:
x = 2
for i in coords.values():
i.grid(row=x, column=2)
x += 1
但是,只要我使用一个简单的函数自动生成一个网格,然后将其放置在网格中,它就不会起作用:
def make(width, height, element):
grid = {}
for y in range(height):
for x in range(width):
print ("X: " + str(x))
print ("Y: " + str(y))
grid[x, y] = element
return grid
我试图找到原因,但是我唯一能找到的是该函数似乎创建了完全相同的按钮,并且当我尝试放置它们时,每个按钮都具有相同的行和列配置:
这是放置每个按钮的代码(与另一个按钮非常相似,只是使用字典的长度来知道将其放置在何处)
self.p1g = make(int(self.size[0]), int(self.size[1]), ttk.Button(self.frame_p1g))
print(self.p1g)
x = 2
y = 2
for butt in self.p1g.values():
butt.grid(row=y, column=x)
x += 1
if x > (list(self.p1g.keys())[-1][0]):
x = 2
y += 1
问题:如何使它与字典配合使用(我真的需要那些坐标来引用按钮)