Написание математического уравнения для ответа в .txt с помощью виджета tkinter - PullRequest
0 голосов
/ 19 апреля 2020

извините за странный код ... это результат 7 часов попыток заставить вещи работать.

Я хочу записать количество, имя, цену и НДС, включая цену, в текстовом файле через python & tkinter.

До сих пор я могу успешно получить записанное количество, имя, цену к тексту, однако, я не могу понять, как взять цену, рассчитать ее и написать ответ на текст.

Я пытался обойти проблему int vs str несколькими способами, включая вычисление цены и использование .insert () для отправки ответа в Ent5 (поле ввода) и получения ответа с помощью .get () для записи это к тексту, но я получаю код ошибки. ->

"Ошибка типа: невозможно умножить последовательность на не-int типа 'float'"

Я использую .pack () для ускорения тестирования перед переходом к сетке и Я знаю, что сетка лучше.

Вот небольшой фрагмент кода:

import tkinter as tk
from tkinter import *
import math

top = tk.Tk()
top.title('Name')
top.geometry('500x450')

v = IntVar()

Ent1 = tk.Entry(top, textvariable=v, show=None, font=('Arial', 16))
Ent2 = tk.Entry(top, show=None, font=('Arial', 16))
Ent3 = tk.Entry(top, textvariable=vT, show=None, font=('Arial', 16))
Ent5 = tk.Entry(top, show=None, font=('Arial', 16)) ###PLACEHOLDER

lbl1 = tk.Label(top, text='Quantity')
lbl2 = tk.Label(top, text='Product')
lbl3 = tk.Label(top, text='Price')

lbl1.pack()
Ent1.pack()
lbl2.pack()
Ent2.pack()
lbl3.pack()
Ent3.pack()
Ent5.pack() ###PLACEHOLDER

int_answers = int(Ent3.get())

def com2():
    km = int_answers*1.15
    Ent5.insert(0, '1.15') ### PLACEHOLDER

def com1():
    com2()
    file1 = open('eca.txt', 'a')
    L = [Ent1.get(), '   |   ' , Ent2.get(), '   |   ' , Ent3.get(), km,'\n']
    file1.writelines(L)
    file1.close()

Btn1 = tk.Button(top, command=com1, text='Ok').pack(side=BOTTOM)

top.mainloop()

Заранее благодарен за любую помощь

1 Ответ

1 голос
/ 20 апреля 2020

Я не могу воспроизвести сообщение об ошибке, но получил пару других.

int_answers = int(Ent3.get()) должен вызываться функцией команды кнопки. Я положил его внутрь com2. В вопросе int_answers обнуляется до запуска mainl oop. Поэтому он не изменяется, так как запись изменена. Перемещение в код, запускаемый после нажатия кнопки «ОК», означает, что запись читается после ее изменения.

import tkinter as tk
from tkinter import *
import math

top = tk.Tk()
top.title('Name')
top.geometry('500x450')

v = IntVar()
vT = IntVar() # Missing in the question.

Ent1 = tk.Entry(top, textvariable=v, show=None, font=('Arial', 16))
Ent2 = tk.Entry(top, show=None, font=('Arial', 16))
Ent3 = tk.Entry(top, textvariable=vT, show=None, font=('Arial', 16))

lbl1 = tk.Label(top, text='Quantity')
lbl2 = tk.Label(top, text='Product')
lbl3 = tk.Label(top, text='Price')

result = tk.Label( top, text = '0') # See the result in the GUI

lbl1.pack()
Ent1.pack()
lbl2.pack()
Ent2.pack()
lbl3.pack()
Ent3.pack()
result.pack()

# int_answers = int(Ent3.get())
# Move inside the com2 function

def com2():
    int_answers = int(Ent3.get())
    km = int_answers*1.15
    result.config( text = str(km)) # Show the result in the GUI
    return km   # Return the result to com1.

def com1():
    km = com2() # Otherwise com1 can't 'see' km
    file1 = open('eca.txt', 'a')
    L = [Ent1.get(), '   |   ' , Ent2.get(), '   |   ' , Ent3.get(), str(km),'\n']
    file1.writelines(L)
    print(L) # Seewhat's happening in the console.
    file1.close()

Btn1 = tk.Button(top, command=com1, text='Ok').pack(side=BOTTOM)

top.mainloop()

Еще один момент. Я бы использовал более надежное to_int преобразование. Он вернет ноль, если строка не может преобразовать в int, а не вызвать исключение.

def to_int( string):
    try: 
        return int(string)
    except ValueError:
        return 0
...