Tkinter / Python 3.7 - Как установить флажки как обязательные - если пользователь не проверяет - на экране должно появиться всплывающее окно - PullRequest
0 голосов
/ 09 февраля 2020

Что я пытаюсь сделать:

Я пытаюсь создать небольшую программу в tkinter, где она рассчитывает комиссию для клиента на основе характеристик клиента, которые пользователь должен установить для некоторых флажков. Каждый флажок имеет значение оценки, которое будет суммой, когда пользователь нажмет кнопку sh, и эта сумма будет умножена на 500 фунтов стерлингов (каждая точка составляет 500 фунтов стерлингов в виде сборов)

Проблема:

необходимо выбрать группу из 3 флажков (с переменной = var2), прежде чем пользователь нажмет кнопку «Рассчитать комиссионные». Я хотел бы, чтобы, если пользователь забыл установить один из флажков в переменной = var 2, на экране должно появиться всплывающее окно с сообщением: «Ошибка, вы не установили обязательный флажок, пожалуйста, проверьте еще раз, прежде чем рассчитывать сборы "

В программе, которую я пытаюсь сделать, есть еще 4 или 5 групп флажков, которые нужно выбрать один раз, прежде чем рассчитывать сборы (здесь я просто вставил часть программы, иначе она слишком длинная)

Что я пробовал:

in the def addtolist() i tried to put an if statement to check if, before the program calculate the 
fees, the checkboxes with var2 has been selected once. Unfurtunately this does not work, here the 
error message from python:

Исключение в обратном вызове Tkinter (последний последний вызов):
Файл "C: \ Users \ sheha \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ tkinter__init __. Py ", строка 508, в get return self._tk.getint (value) _tkinter.TclError: ожидаемое целое число, но полученное" "

Во время обработки выше исключения произошло другое исключение:

Трассировка (последний последний вызов): файл "C: \ Users \ sheha \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ tkinter__init __. py", строка 1705, в call return self.fun c (* args) Файл "test_final.py", строка 20, в addtolist, если var2.get ()! = "": File "C: \ Users \ sheha \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ tkinter__init __. py ", строка 510, в get return int (self._tk.getdouble (value)) _tkinter.TclError: ожидается число с плавающей точкой, но получено" "*

На основании этой ошибки, если я пытаюсь изменить значение флажка с var2 с "" на 0 (ноль), один из блоков в этой группе будет автоматически выбран при запуске программы (Я хотел бы избежать выбора по умолчанию, если это возможно)

Можете ли вы помочь мне?

Пожалуйста, найдите код ниже Спасибо

import tkinter as tk

from tkinter import *

from tkinter import messagebox

# --- functions ---

def on_configure(event):
    # update scrollregion after starting 'mainloop'
    # when all widgets are in canvas
    canvas.configure(scrollregion=canvas.bbox('all'))


def addtolist():
    global List

    List = []

    if var2.get() != "":
        for item in varList:
            if item.get() != "":
                List.append(item.get())
        sum_list =sum(List)
        fees=sum_list*500
        messagebox.showinfo('Fee calculated', 'This client has scored %s points and the fees for the audit job is: £%s' %(sum_list, fees))
    else:
        messagebox.showerror('Mandatory checkboxe has been skipped', 'Error, you have not checked a mandatory checkbox, please check again before calculate the fees')    

# --- main ---

List = []
varList = []


root = tk.Tk()
root.title("Audit Pricing Tool")
root.geometry("500x500")

# --- create canvas with scrollbar ---

canvas = tk.Canvas(root)
canvas.pack(side=tk.LEFT, fill='both', expand=True)

scrollbar = tk.Scrollbar(root, command=canvas.yview)
scrollbar.pack(side=tk.LEFT, fill='y')

canvas.configure(yscrollcommand = scrollbar.set)

# update scrollregion after starting 'mainloop'
# when all widgets are in canvas
canvas.bind('<Configure>', on_configure)

# --- put frame in canvas ---

frame = tk.Frame(master=root, width=980, height=980)
canvas.create_window((0,0), window=frame, anchor='nw')
#frame.pack_propagate(0) #Don't allow the widgets inside to determine the frame's width / height
#frame.pack(fill=tk.BOTH, expand=True) #Expand the frame to fill the root window

# --- add widgets in frame ---

label_title=Label(frame, text="Pricing Tool", height=3, fg="blue", font=(20))
label_title.grid(row=1, column=1, columnspan=2 , sticky=N)

#this checkbox need to be selected by default

var1 = IntVar()
cb1 = Checkbutton(frame, text="Base Price (applies to all)", variable=var1,
                           onvalue=15, offvalue="")
cb1.grid(row=11, column=1, sticky=W)
cb1.select()


#label for Appointment/reappointment (need to select only one of these 3 checkboxes before calculate the fees
# if the user skip this section and try to calculate the fees - it should get an error pop up and tell to the use
# to check on of the mandatory boxes
# )
lb1=Label(frame, text="Appointment/reappointment (select one)", height=3)
lb1.grid(row=13, column=1, sticky=N)

var2 = IntVar()
cb2 = Checkbutton(frame, text="taking over from another auditor", variable=var2,
                         onvalue=5, offvalue=0)
cb2.grid(row=14, column=1,sticky=W)

cb3 = Checkbutton(frame, text="First year that accounts require audit", variable=var2,
                         onvalue=3, offvalue=0)
cb3.grid(row=15, column=1,sticky=W)

cb4 = Checkbutton(frame, text="Continuing engagement", variable=var2,
                         onvalue=0, offvalue=0)
cb4.deselect()
cb4.grid(row=16, column=1,sticky=W)


# for the checkboxes below, you can select or not select (it is not mandatory)

lb8=Label(frame, text="Additional complexities (select all that apply)", height=3)
lb8.grid(row=66, column=1, sticky=N)

var9 = IntVar()
cb38 = Checkbutton(frame, text="Accounts prepared under IFRS / FRS 101", variable=var9,
                         onvalue=2, offvalue=0)
cb38.grid(row=67, column=1,sticky=W)

var10 = IntVar()
cb39 = Checkbutton(frame, text="Change of accounting software", variable=var10,
                         onvalue=2, offvalue=0)
cb39.grid(row=68, column=1,sticky=W)

var11 = IntVar()
cb40 = Checkbutton(frame, text="Stock", variable=var11,
                         onvalue=1, offvalue=0)
cb40.grid(row=69, column=1,sticky=W)

var12 = IntVar()
cb41 = Checkbutton(frame, text="Stocktake attendance", variable=var12,
                         onvalue=2, offvalue=0)
cb41.grid(row=70, column=1,sticky=W)


var24 = IntVar()
cb50 = Checkbutton(frame, text="Turnover < £1 million", variable=var24,
                         onvalue=-1, offvalue=0)
cb50.grid(row=86, column=1,sticky=W)


varList.append(var1)
varList.append(var2)
varList.append(var9)
varList.append(var10)
varList.append(var11)
varList.append(var12)
varList.append(var24)

b1 = Button(frame, text="Calculate fees", command=addtolist)
b1.grid(row=100, column=1, sticky=N)


frame.mainloop()

root.mainloop()

1 Ответ

1 голос
/ 09 февраля 2020

Так что да, эта ошибка, кажется, генерируется, если флажок cb1 не установлен. Вы можете изменить offvalue на 0 или даже None.

cb1 = Checkbutton(frame, text="Base Price (applies to all)", variable=var1,
                           onvalue=15, offvalue=0)

Чтобы помочь с вашей функцией addtolist, вы можете изменить сравнение на var2.get() !=0: Это предполагает, что offvalue of 0 означает, что флажок пуст.

Затем вы можете снять выделение cb4 и изменить onvalue с 0:

cb4 = Checkbutton(frame, text="Continuing engagement", variable=var2,
                         onvalue=1, offvalue=0)
cb4.grid(row=16, column=1,sticky=W)

Это должно теперь привести к вашей ошибке, если они оставят флажки в var2 не проверенными. , без автоматического выбора одного при запуске.

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