кнопки ttk в python диктуют ссылку на один и тот же объект, проблема генерации? - PullRequest
0 голосов
/ 21 ноября 2018

Я действительно запутался в проблеме, с которой столкнулся.Я потратил некоторое время, пытаясь решить проблему как можно больше, и вот она:

Я работаю с 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)}

Я просто использовал этот же dict для своей сетки и этот кодздесь, и он отлично работает:

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

Изображение с результатом

Я пытался найти причину, но единственное, что я мог найтибыло то, что функция, кажется, создает точно такие же кнопки, и как-то, когда я пытаюсь разместить их, каждая кнопкаts та же конфигурация строки и столбца:

Dict print из рабочего dict

Dict print из ошибочного списка

И этоэто код, который помещает каждую кнопку (просто очень похоже на другую, просто используя длину слова, чтобы узнать, где их разместить)

    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

Вопрос: Как я могузаставить его работать с помощью dict? (мне действительно нужны эти координаты для ссылки на кнопки)

...