Python проблема с калькулятором - PullRequest
1 голос
/ 26 мая 2020

Пытаюсь сделать калькулятор с Tkinter в python 3.8.2. Пробую сделать кнопки с for l oop. Я сделал функцию, которая должна печатать значение кнопки, но печатает только 3, то есть последнюю кнопку, созданную кодом. Можно исправить?

import tkinter as tk

class Calculator:
    def interface(self):
        self.i = tk.Tk()
        self.i.geometry("700x800")
        self.word = ["789","456","123"]
        self.display = tk.Entry(self.i, text = "", width = 107,bg = "#acd", justify = 
                    "right", bd = 30)
        self.display.grid(row = 0)
        self.f = tk.Frame(self.i)
        self.f.grid(row = 1)
        self.rows = 0
        for i in self.word:
            self.col = 0
                for char in i:
                    but = tk.Button(self.f, text = char, command = lambda: 
                        self.writenum(char), height = 8,width = 16)
                    but.grid(row =self.rows, column = self.col)
                    self.col += 1
                self.rows += 1
        self.i.mainloop()

    def writenum(self,arg):
        print(arg)

c = Calculator()
c.interface()

1 Ответ

1 голос
/ 26 мая 2020

вы можете использовать functools.partial для решения вашей проблемы. Вместо использования lambda вы можете создать вызываемый объект, который заполнит соответствующие параметры и вызовет другую функцию. Вот обновленный код:

import tkinter as tk
from functools import partial


class Calculator:
    def interface(self):
        self.i = tk.Tk()
        self.i.geometry("700x800")
        self.word = ["789", "456", "123"]
        self.display = tk.Entry(
            self.i, text="", width=107, bg="#acd", justify="right", bd=30
        )
        self.display.grid(row=0)
        self.f = tk.Frame(self.i)
        self.f.grid(row=1)
        self.rows = 0
        for i in self.word:
            self.col = 0
            for char in i:
                but = tk.Button(
                    self.f,
                    text=char,
                    command=partial(self.writenum, char),
                    height=8,
                    width=16,
                )
                but.grid(row=self.rows, column=self.col)
                self.col += 1
            self.rows += 1
        self.i.mainloop()

    def writenum(self, arg):
        print(arg)


c = Calculator()
c.interface()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...