please help me I have tried so much things but this doesn't work...
I'm beginner in POO (my code is so ugly wtf) and i don't understand why my code doesn't work ...
I give you a code which works and a code which doesn't work while they used the same attribute ...
this code works:
from tkinter import *
import tkinter as tk
import time
root = Tk()
x = 0
y = 0
def move_window(event):
# global x, y
print(x, y)
root.geometry('+{0}+{1}'.format(event.x_root - x, event.y_root - y))
root.overrideredirect(True) # turns off title bar, geometry
root.geometry('400x200+200+200') # set new geometry
# make a frame for the title bar
title_bar = Frame(root, bg='white', relief='raised', bd=2)
# put a close button on the title bar
close_button = Button(title_bar, text='X', command=root.destroy)
# a canvas for the main area of the window
window = Canvas(root, bg='black')
# pack the widgets
title_bar.pack(expand=1, fill=X)
close_button.pack(side=RIGHT)
window.pack(expand=1, fill=BOTH)
# bind title bar motion to the move window function
def setxy(event):
global x,y
x=event.x_root - root.winfo_x()
y=event.y_root - root.winfo_y()
# print(x,y)
return x,y;
title_bar.bind('<1>',setxy)
title_bar.bind('<B1-Motion>', move_window)
root.mainloop()
and this one doesn't :
import os
import tkinter as tk
from tkinter import *
from tkinter import font
win = tk.Tk()
win.overrideredirect(1)
# def realcenter( o, w, h ) ->'o(w,h) centered on screen':
# x = o.winfo_screenwidth( ) - w
# y = o.winfo_screenheight( ) - h
# o.geometry( f'{w}x{h}+{int( x/2 )}+{int( y/2 )}' )
# def restore( ev ):
# win.overrideredirect( 0 )
# def unrestore( ev ):
# win.overrideredirect( 1 )
# win.geometry( '500x525' )
# realcenter( win, 500, 525)
# win.update_idletasks()
# win.overrideredirect( 1 )
# win.bind( '<F1>', restore )
# win.bind( '<F2>', unrestore )
font1 = font.Font(family = 'Helvetica', size = 15)
font3 = font.Font(family = 'Helvetica', size = 8, weight = 'bold')
font2 = font.Font(family = 'Helvetica', size = 20, weight = 'bold')
def aaa(colora, colorb, colorc, colord, colore, colorf):
Dark = Theme('#18181F','#0C0C0F',"#505063",'#D1DDFF','#D12319',"#D1665F")
Ecrire('',Light)
def aaaa(colora, colorb, colorc, colord, colore, colorf):
Light = Theme('#F1EDF5','#D1D2E8',"#EDD5EB",'#323133','#6F2EB0',"#C47ED6")
Ecrire('',Dark)
def strl(list):
list ="".join(list)
return list
# menubar = Menu(win)
# win.config(menu=menubar)
# menufichier = Menu(menubar,tearoff=0)
# menubar.add_cascade(label="Theme", menu=menufichier)
# menufichier.add_command(label=" Dark mode",font = font3,command =lambda: aaa('#18181F','#0C0C0F',"#505063",'#D1DDFF','#D12319',"#D1665F"))
# menufichier.add_command(label=" Light mode",font = font3,command =lambda: aaaa('#F1EDF5','#D1D2E8',"#EDD5EB",'#323133','#6F2EB0',"#C47ED6"))
pixel = tk.PhotoImage(width=1, height=1)
a =95
b =95
theme = 0
t = 0
ecrit = []
nombre_de_multdiv = 0
nombre_de_sous_add = 0
def Del(self):
global ecrit
del ecrit[-1]
affichage = strl(ecrit)
self.label1['text'] = affichage
self.label1.place(anchor = 'e', x = 450, y = 75)
def Del_all(self):
global ecrit
del ecrit[:]
affichage = strl(ecrit)
self.label1['text'] = affichage
self.label1.place(anchor = 'e', x = 450, y = 75)
def Ecrire(symbole,self):
ecrit.append(symbole)
affichage = strl(ecrit)
self.label1['text'] = affichage
self.label1.place(anchor = 'e', x = 450, y = 75)
def Ecrire_Resulat(valeur,self):
valeur = strl(valeur)
self.label1['text'] = valeur
def Calcul(self):
global nombre_de_multdiv
global nombre_de_sous_add
for i in range(len(ecrit)):
if ecrit[i] == '/' or ecrit[i] == '*':
nombre_de_multdiv +=1
for i in range(len(ecrit)):
if ecrit[i] == '+' or ecrit[i] == '-':
nombre_de_sous_add +=1
for i in range(nombre_de_multdiv):
for i in range(len(ecrit)):
if ecrit[i] == '*' or ecrit[i] == '/':
numero = i
nb = i
nbb = i
for i in range(len(ecrit)-numero-1):
if ecrit[i+1 + numero] != '/' and ecrit[i+1 + numero] != '*' and ecrit[i+1 + numero] != '+' and ecrit[i+1 + numero] != '-':
nb +=1
elif ecrit[i+1+numero] == '/' or ecrit[i+1+numero] == '*' or ecrit[i+1+numero] == '+' or ecrit[i+1+numero] == '-':
break
for i in range(numero):
i = -i
if ecrit[i-1+numero] != '/' and ecrit[i-1+numero] != '*' and ecrit[i-1+numero] != '+' and ecrit[i-1+numero] != '-':
nbb -=1
elif ecrit[i-1+numero] == '/' or ecrit[i-1+numero] == '*' or ecrit[i-1+numero] == '+' or ecrit[i-1+numero] == '-':
break
nombre1 = "".join(ecrit[numero+1:nb+1])
nombre1 = float(nombre1)
nombre2 = "".join(ecrit[nbb:numero])
nombre2 = float(nombre2)
if ecrit[numero] =='*':
resultat = nombre1 * nombre2
if resultat == int(resultat):
resultat = int(resultat)
resultat = list(str(resultat))
else:
resultat = nombre2 / nombre1
if resultat == int(resultat):
resultat = int(resultat)
resultat = list(str(resultat))
del ecrit[nbb:nb+1]
for i in range(len(resultat)):
ecrit.insert(nbb+i,resultat[i])
break
for i in range(nombre_de_sous_add):
for i in range(len(ecrit)):
if ecrit[i] == '+' or ecrit[i] == '-':
numero = i
nb = i
nbb = i
for i in range(len(ecrit)-numero-1):
if ecrit[i+1 + numero] != '/' and ecrit[i+1 + numero] != '*' and ecrit[i+1 + numero] != '+' and ecrit[i+1 + numero] != '-':
nb +=1
elif ecrit[i+1+numero] == '/' or ecrit[i+1+numero] == '*' or ecrit[i+1+numero] == '+' or ecrit[i+1+numero] == '-':
break
for i in range(numero):
i = -i
if ecrit[i-1+numero] != '/' and ecrit[i-1+numero] != '*' and ecrit[i-1+numero] != '+' and ecrit[i-1+numero] != '-':
nbb -=1
elif ecrit[i-1+numero] == '/' or ecrit[i-1+numero] == '*' or ecrit[i-1+numero] == '+' or ecrit[i-1+numero] == '-':
break
nombre1 = "".join(ecrit[numero+1:nb+1])
nombre1 = float(nombre1)
nombre2 = "".join(ecrit[nbb:numero])
nombre2 = float(nombre2)
if ecrit[numero] =='+':
resultat = nombre1 + nombre2
if resultat == int(resultat):
resultat = int(resultat)
resultat = list(str(resultat))
else:
resultat = nombre2 - nombre1
if resultat == int(resultat):
resultat = int(resultat)
resultat = list(str(resultat))
del ecrit[nbb:nb+1]
for i in range(len(resultat)):
ecrit.insert(nbb+i,resultat[i])
break
Ecrire_Resulat(ecrit,self)
class Theme():
def move_window(self,event):
# global x, y
print(self.x, self.y)
win.geometry('+{0}+{1}'.format(event.x_win - self.x, event.y_win - self.y))
def set_xy(self,event):
self.x=event.x_win - win.winfo_x()
self.y=event.y_win - win.winfo_y()
# print(x,y)
return self.x,self.y;
def boutontheme(self,colora, colorb, colorc, colord, colore, colorf):
self.openmenu(colora, colorb, colorc, colord, colore, colorf)
if self.t == 0:
Light = Theme('#F1EDF5','#D1D2E8',"#EDD5EB",'#323133','#6F2EB0',"#915ec4")
self.t = 1
else:
Dark = Theme('#18181F','#0C0C0F',"#505063",'#D1DDFF','#D12319',"#D1665F")
self.t = 0
def openmenu(self,colora, colorb, colorc, colord, colore, colorf):
if self.ouvert == False:
self.b_theme.config(bg = colore)
if self.t == 0:
self.b_theme_dark = tk.Button(win,state=DISABLED, text = 'Dark theme',font = font3,borderwidth=0, highlightthickness=0,compound="c",image = pixel,height = 20,width = 70,activebackground =colore,bg =colora,fg = colord,command = lambda: self.boutontheme(colora, colorb, colorc, colord, colore, colorf))
self.b_theme_light = tk.Button(win,state=NORMAL, text = 'Light theme',font = font3,borderwidth=0, highlightthickness=0,compound="c",image = pixel,height = 20,width = 70,activebackground =colore,bg =colora,fg = colord,command = lambda: self.boutontheme(colora, colorb, colorc, colord, colore, colorf))
else:
self.b_theme_dark = tk.Button(win,state=NORMAL, text = 'Dark theme',font = font3,borderwidth=0, highlightthickness=0,compound="c",image = pixel,height = 20,width = 70,activebackground =colore,bg =colora,fg = colord,command = lambda: self.boutontheme(colora, colorb, colorc, colord, colore, colorf))
self.b_theme_light = tk.Button(win,state=DISABLED, text = 'Light theme',font = font3,borderwidth=0, highlightthickness=0,compound="c",image = pixel,height = 20,width = 70,activebackground =colore,bg =colora,fg = colord,command = lambda: self.boutontheme(colora, colorb, colorc, colord, colore, colorf))
self.b_theme_dark.place(anchor = 'nw', x = 5, y = 25)
self.b_theme_light.place(anchor = 'nw', x = 5, y = 45)
self.ouvert = True
return;
if self.ouvert == True:
self.b_theme.config(bg = colorb)
self.b_theme_dark.destroy()
self.b_theme_light.destroy()
self.ouvert = False
return;
# def closemenu(self):
# self.b_theme_dark.forget()
# self.b_theme_light.forget()
# ouvert = False
def __init__(self,colora, colorb, colorc, colord, colore, colorf):
if colora == '#18181F':
self.t = 0
else:
self.t = 1
self.ouvert = False
self.x = 0
self.y=0
#creation menu
self.canvas_menu = Canvas(win, width =500, height =25, bg = colora, borderwidth=0, highlightthickness=0)
self.exit = Canvas(bg = colora,borderwidth=0, highlightthickness=0)
self.exit.create_oval(0,0,20,20, fill= colore,width = 0)
self.exit.create_text(10, 10, text="x", fill = colord, font= font3)
self.exit.bind("<Button-1>", lambda e: win.destroy())
#affichage menu
self.exit.place(anchor = 'nw', x = 475, y = 2)
self.canvas_menu.grid(row = 0,column = 0, columnspan = 5)
#creation des canvas
self.canvas_screen = Canvas(win, width =500, height =100, bg =colorb,borderwidth=0, highlightthickness=0)
self.canvas_keyb_num = Canvas(win, width =300, height =400, bg =colorb,borderwidth=0, highlightthickness=0)
self.canvas_keyb_op = Canvas(win, width =200, height =400, bg =colorb,borderwidth=0, highlightthickness=0)
#affchage des canvas
self.canvas_screen.grid(row = 1,column = 0, columnspan = 5)
self.canvas_keyb_num.grid(row = 2,column = 0, columnspan = 3, rowspan = 4)
self.canvas_keyb_op.grid(row = 2,column = 3, columnspan = 2, rowspan = 4)
# creation des boutons
self.b1 = Button(win, text ='1',borderwidth=0, highlightthickness=0, bg = colora,activebackground =colorc,foreground=colord,compound="c",image = pixel,height = a,width = b ,font = font1,command=lambda: Ecrire('1',self))
self.b2 = Button(win, text ='2',borderwidth=0, highlightthickness=0, bg = colora,activebackground =colorc,foreground=colord,compound="c",image = pixel,height = a,width = b ,font = font1,command=lambda: Ecrire('2',self))
self.b3 = Button(win, text ='3',borderwidth=0, highlightthickness=0, bg = colora,activebackground =colorc,foreground=colord,compound="c",image = pixel,height = a,width = b ,font = font1,command=lambda: Ecrire('3',self))
self.b4 = Button(win, text ='4',borderwidth=0, highlightthickness=0, bg = colora,activebackground =colorc,foreground=colord,compound="c",image = pixel,height = a,width = b ,font = font1,command=lambda: Ecrire('4',self))
self.b5 = Button(win, text ='5',borderwidth=0, highlightthickness=0, bg = colora,activebackground =colorc,foreground=colord,compound="c",image = pixel,height = a,width = b ,font = font1,command=lambda: Ecrire('5',self))
self.b6 = Button(win, text ='6',borderwidth=0, highlightthickness=0, bg = colora,activebackground =colorc,foreground=colord,compound="c",image = pixel,height = a,width = b ,font = font1,command=lambda: Ecrire('6',self))
self.b7 = Button(win, text ='7',borderwidth=0, highlightthickness=0, bg = colora,activebackground =colorc,foreground=colord,compound="c",image = pixel,height = a,width = b ,font = font1,command=lambda: Ecrire('7',self))
self.b8 = Button(win, text ='8',borderwidth=0, highlightthickness=0, bg = colora,activebackground =colorc,foreground=colord,compound="c",image = pixel,height = a,width = b ,font = font1,command=lambda: Ecrire('8',self))
self.b9 = Button(win, text ='9',borderwidth=0, highlightthickness=0, bg = colora,activebackground =colorc,foreground=colord,compound="c",image = pixel,height = a,width = b ,font = font1,command=lambda: Ecrire('9',self))
self.b_point = Button(win, text ='.',borderwidth=0, highlightthickness=0, bg = colora,activebackground =colorc,foreground=colord,compound="c",image = pixel,height = a,width = b ,font = font1,command=lambda: Ecrire('.',self))
self.b0 = Button(win, text ='0',borderwidth=0, highlightthickness=0, bg = colora,activebackground =colorc,foreground=colord,compound="c",image = pixel,height = a,width = b ,font = font1,command=lambda: Ecrire('0',self))
self.b_plus = Button(win, text ='+',borderwidth=0, highlightthickness=0, bg = colora,activebackground =colorc,foreground=colord,compound="c",image = pixel,height = a,width = b ,font = font1,command=lambda: Ecrire('+',self))
self.b_moins = Button(win, text ='-',borderwidth=0, highlightthickness=0, bg = colora,activebackground =colorc,foreground=colord,compound="c",image = pixel,height = a,width = b ,font = font1,command=lambda: Ecrire('-',self))
self.b_fois = Button(win, text ='*',borderwidth=0, highlightthickness=0, bg = colora,activebackground =colorc,foreground=colord,compound="c",image = pixel,height = a,width = b ,font = font1,command=lambda: Ecrire('*',self))
self.b_diviser = Button(win, text ='/',borderwidth=0, highlightthickness=0, bg = colora,activebackground =colorc,foreground=colord,compound="c",image = pixel,height = a,width = b ,font = font1,command=lambda: Ecrire('/',self))
self.b_del = Button(win, text ='DEL',borderwidth=0, highlightthickness=0, bg = colora,activebackground =colorc,foreground=colord,compound="c",image = pixel,height = a,width = b ,font = font1,command=lambda: Del(self))
self.b_del_all = Button(win, text ='CE',borderwidth=0, highlightthickness=0, bg = colora,activebackground =colorc,foreground=colord,compound="c",image = pixel,height = a,width = b ,font = font1,command=lambda: Del_all(self))
self.b_egale = Button(win, text ='=',borderwidth=0, highlightthickness=0, bg = colore,activebackground =colorf,foreground=colord,compound="c",image = pixel,height = a,width = 295 ,font = font1,command= lambda: Calcul(self))
#affichage des nombres
#colone 1
self.b7.grid(column = 0, row = 2)
self.b4.grid(column = 0, row = 3)
self.b1.grid(column = 0, row = 4)
self.b_point.grid(column = 0, row = 5)
#colone 2
self.b8.grid(column = 1, row = 2)
self.b5.grid(column = 1, row = 3)
self.b2.grid(column = 1, row = 4)
self.b0.grid(column = 1, row = 5)
#colone 3
self.b9.grid(column = 2, row = 2)
self.b6.grid(column = 2, row = 3)
self.b3.grid(column = 2, row = 4)
#operateurs
self.b_plus.grid(column = 3, row = 2)
self.b_moins.grid(column = 4, row = 2)
self.b_fois.grid(column = 3, row = 3)
self.b_diviser.grid(column = 4, row = 3)
self.b_del.grid(column = 3, row = 4)
self.b_del_all.grid(column = 4, row = 4)
self.b_egale.grid(column = 2, row = 5,columnspan = 3)
#ecriture
self.label1 = tk.Label(win, text = '', justify = tk.RIGHT,font = font2,bg =colorb,fg = colord)
self.label1.place(anchor = 'e', x = 450, y = 75)
self.b_theme = tk.Button(win, text = 'Themes',font = font3,bg =colorb,fg = colord,borderwidth=0, highlightthickness=0,compound="c",image = pixel,height = 20,width = 50,activebackground =colore,command= lambda: self.openmenu(colora, colorb, colorc, colord, colore, colorf))
self.b_theme.place(anchor = 'nw', x = 5, y = 2)
self.canvas_menu.bind('<1>', self.set_xy)
# bind title bar motion to the move window function
self.canvas_menu.bind('<B1-Motion>', self.move_window)
# b_theme_dark.config(bg =colorb,fg = colord, activebackground =colore)
# b_theme_light.config(bg =colorb,fg = colord, activebackground =colore)
# menufichier.config(activebackground = colorc,bg = colora,fg = colord)
if theme == 0:
Dark = Theme('#18181F','#0C0C0F',"#505063",'#D1DDFF','#D12319',"#D1665F")
else:
Light = Theme('#F1EDF5','#D1D2E8',"#EDD5EB",'#323133','#6F2EB0',"#915ec4")
win.title('calculator')
#pour un future menu
# bouton.config(state=DISABLED)
# bouton.config(state=NORMAL)
win.resizable(height=False,width=False)
win.mainloop()
set on line 9- 10 this:
GLOBAL_X = 0
GLOBAL_Y = 0
at line 242 this:
def move_window(self, event):
global GLOBAL_X, GLOBAL_Y
x = win.winfo_pointerx() - GLOBAL_X
y = win.winfo_pointery() - GLOBAL_Y
win.geometry("+%d+%d" % (x,y))
def set_xy(self, event):
global GLOBAL_X, GLOBAL_Y
GLOBAL_X= win.winfo_rootx()- event.widget.winfo_rootx() + event.x
GLOBAL_Y = win.winfo_rooty() - event.widget.winfo_rooty() + event.y
and don forget on line 448 this:
self.canvas_menu.bind("<Button-1>", self.set_xy)
Replace event.x_name_of_the_window with event.x_root.
Related
I ran into this problem and don't know how to solve it.
When I press the "generate" button(self.gen), my picture 11 changes to picture 22.
BUT I need the image 11 to NOT change when the button is clicked and an error occurs(messagebox.showerror pops up) OR so that after closing the messagebox.showerror, picture 22 changes to 11
import tkinter
from tkinter import *
from tkinter import messagebox, scrolledtext
from PIL import Image, ImageTk
from random import randint
class App:
def __init__(self):
self.window = tkinter.Tk()
self.window.title("Генератор")
self.window['bg'] = '#FFF5EE'
self.window.geometry('660x550')
self.window.resizable(False,False)
self.lb1 = Label(self.window, text="Enter:", background='#FFF5EE', font = ("Comic Sans MS", 14))
self.lb1.grid(column=0, row=2)
self.lb2 = Label(self.window, text="min(1-999)",background='#FFF5EE', font = ("Comic Sans MS", 12))
self.lb2.grid(column=1, row=3)
self.lb3 = Label(self.window, text="max(1-999)", background='#FFF5EE', font = ("Comic Sans MS", 12))
self.lb3.grid(column=1, row=4)
self.lb4 = Label(self.window, text="amount of numbers", background='#FFF5EE', font = ("Comic Sans MS", 12))
self.lb4.grid(column=4, row=3)
self.txt2 = Entry(self.window,width=10, borderwidth=3)
self.txt2.grid(column=2, row=3)
self.txt3 = Entry(self.window,width=10, borderwidth=3)
self.txt3.grid(column=2, row=4)
self.txt4 = Entry(self.window,width=10, borderwidth=3)
self.txt4.grid(column=5, row=3)
self.scrolltxt = scrolledtext.ScrolledText(self.window, width=30, height=3, borderwidth=7, state='disabled')
self.scrolltxt.grid(row=1, column=2, columnspan=3, padx=10, pady=10)
self.image = Image.open("C:\\Users\\ПК\\OneDrive\\Рабочий стол\\лб1\\11.png")
self.photo = ImageTk.PhotoImage(self.image)
self.gen = Button(self.window, width = 15, text="Generate", command = lambda:[self.clicked1(), self.gen1()])
self.gen.grid(row=4, column=6)
self.canvas = tkinter.Canvas(self.window, height=230, width=230)
self.canvas.grid(row=0,column=4)
self.image = self.canvas.create_image(0, 0, anchor='nw', image = self.photo)
self.btn = Button(self.window, width = 15, text="Delete", command=lambda:[self.delete(),self.clicked2()])
self.btn.grid(column=6, row=5)
self.exit = Button(self.window, width = 15, text="Exit", command=lambda: [self.clicked3(), quit()])
self.exit.grid(column=6, row=6)
self.i = Button(self.window, width = 8,text = "i", font = ("Eras Bold ITC", 10) , command = self.inf)
self.i.grid(row = 0,column = 6)
self.window.mainloop()
def clicked1(self):
print("clicked1")
self.image = Image.open("C:\\Users\\ПК\\OneDrive\\Рабочий стол\\лб1\\22.png")
self.photo = ImageTk.PhotoImage(self.image)
self.canvas.grid(row=0,column=4)
self.image = self.canvas.create_image(0, 0, anchor='nw',image=self.photo)
def gen1(self):
try:
MinNum = int(self.txt2.get())
MaxNum = int(self.txt3.get())
Num = int(self.txt4.get())
except ValueError:
messagebox.showerror("Error", "Якщо не рвешся у висоту, шишок не наб'єш.")
else:
Nums = " "
if MinNum <= MaxNum:
i = 0
while i < Num:
numOne = randint(MinNum, MaxNum)
Nums = Nums + ' ' + str(numOne)
i += 1
self.scrolltxt.config(state="normal") # enable the text box
self.scrolltxt.delete(1.0, END)
self.scrolltxt.insert(INSERT, str(Nums) + "\n")
self.scrolltxt.config(state="disabled") # disable the text box
else:
messagebox.showerror("Error", "Якщо не рвешся у висоту, шишок не наб'єш.")
def delete(self):
self.txt4.delete(0, END)
self.txt3.delete(0, END)
self.txt2.delete(0, END)
self.scrolltxt.config(state="normal") # enable the text box
self.scrolltxt.delete(1.0, END)
self.scrolltxt.config(state="disabled") # disable the text box
def clicked2(self):
print("clicked2")
self.image = Image.open("C:\\Users\\ПК\\OneDrive\\Рабочий стол\\лб1\\11.png")
self.photo = ImageTk.PhotoImage(self.image)
self.canvas.grid(row=0,column=4)
self.image = self.canvas.create_image(0, 0, anchor='nw',image=self.photo)
def clicked3(self):
messagebox.showinfo("Це Звірополіс. Будь-хто може бути будь-ким.", "Хто сказав, що неможливе недосяжне?! Пошкодуйте цього дивака.")
def inf(self):
messagebox.showinfo("Info", "Лисичка замахалась")
app = App()
is it possible to implement this through tkinter?
Change the command argument of self.gen to:
self.gen = Button(self.window, width = 15, text="Generate", command=self.gen1)
And move the call to clicked1() into the if block of gen1() so it will only be called when conditions are accepted
def gen1(self):
try:
MinNum = int(self.txt2.get())
MaxNum = int(self.txt3.get())
Num = int(self.txt4.get())
except ValueError:
messagebox.showerror(
"Error",
"Якщо не рвешся у висоту, шишок не наб'єш."
)
else:
Nums = " "
if MinNum <= MaxNum:
i = 0
while i < Num:
numOne = randint(MinNum, MaxNum)
Nums = Nums + ' ' + str(numOne)
i += 1
self.scrolltxt.config(state="normal") # enable the text box
self.scrolltxt.delete(1.0, END)
self.scrolltxt.insert(INSERT, str(Nums) + "\n")
self.scrolltxt.config(state="disabled") # disable the text box
self.clicked1() # call the 'clicked1' method
else:
messagebox.showerror(
"Error",
"Якщо не рвешся у висоту, шишок не наб'єш."
)
at school we did this program:
import tkinter
ucty = [1234, 5678]
piny = [1234, 4321]
penize = [100, 300]
poradi = None
historie = []
adminUcty = ["admin"]
adminPiny = [1234]
class Pocitani:
def __init__(self, penize, poradi):
self.penize = penize
self.poradi = poradi
def stav(self):
return penize[self.poradi]
def pridej(self, pocetpridan):
self.penize = self.penize + pocetpridan
penize[self.poradi] = self.penize
def odeber(self, pocetodebrat):
if pocetodebrat <= self.penize:
self.penize = self.penize - pocetodebrat
penize[self.poradi] = self.penize
return True
else:
return False
def posli(self, poslat):
if poslat <= self.penize:
self.penize = self.penize - poslat
penize[self.poradi] = self.penize
return True
else:
return False
def jednaSeOCislo(cislo):
try:
int(cislo)
except ValueError:
return False
return True
uživatelského účtu
def zakladniKostra():
global okno2
global vystup1okna2
okno2 = tkinter.Tk()
okno2.geometry("400x650")
canvas = tkinter.Canvas(okno2)
canvas.pack()
canvas.create_polygon(0, 70, 100, 70, 200, 20, fill="red")
canvas.create_polygon(0, 70, 100, 70, 200, 120, fill="red")
canvas.create_polygon(280, 70, 120, 70, 200, 120, fill="blue")
canvas.create_polygon(280, 70, 120, 70, 200, 20, fill="blue")
bankaokna2 = tkinter.Label(okno2, text = "Česká banka", font=("Arial Bold", 35))
bankaokna2.place (x="90", y="130")
nazev1okna2 = tkinter.Label(okno2, text = "Vítej ve svém účtu")
nazev1okna2.place (x="140", y="180")
nazev2okna2 = tkinter.Label(okno2, text = "Vyber možnost co chceš se svým účtem udělat")
nazev2okna2.place (x="50", y="200")
tlacitko1okna2 = tkinter.Button(okno2, text = "Zjistit číslo účtu", command = zjisteniUctu)
tlacitko1okna2.place (x="155", y ="250")
tlacitko2okna2 = tkinter.Button(okno2, text = "Počet peněz na účtu", command = pocetPenez)
tlacitko2okna2.place (x="140", y ="300")
tlacitko3okna2 = tkinter.Button(okno2, text = "Přidání peněz na účet", command = pridejPenizeKostra)
tlacitko3okna2.place (x="135", y ="350")
tlacitko4okna2 = tkinter.Button(okno2, text = "Vybrání peněz z účtu", command = odeberPenizeKostra)
tlacitko4okna2.place (x="135", y ="400")
tlacitko5okna2 = tkinter.Button(okno2, text = "Poslání peněz", command = poslatPenizeKostra)
tlacitko5okna2.place (x="160", y ="450")
tlacitko6okna2 = tkinter.Button(okno2, text = "Výpis historie operací", command = historieOperaci)
tlacitko6okna2.place (x="135", y ="500")
tlacitko7okna2 = tkinter.Button(okno2, text = "Odhlásit se", command = odhlasit)
tlacitko7okna2.place (x="170", y ="550")
vystup1okna2 = tkinter.Label(okno2, text = "")
vystup1okna2.place (x="50", y="600")
def zjisteniUctu():
cisloUctu = ("Číslo účtu je: ", ucty[pinporadi])
vystup1okna2.config(text=cisloUctu, fg="black", font=("Calibri", 15))
def pocetPenez():
vystup = zacni.stav()
cisloUctu = ("Na účtě máš: ", vystup, "KČ")
vystup1okna2.config(text=cisloUctu, fg="black", font=("Calibri", 15))
def pridejPenizeKostra():
global vstuppridej1okno3
global okno3
okno3 = tkinter.Tk()
okno3.geometry("400x150")
nazev1okna3 = tkinter.Label(okno3, text = "Zde si na účet můžeš přidat peníze")
nazev1okna3.place (x="80", y="10")
radekpridej1okna3 = tkinter.Label(okno3, text = "Kolik chceš přidat")
radekpridej1okna3.place (x="30", y="50")
vstuppridej1okno3 = tkinter.Entry(okno3)
vstuppridej1okno3.place (x="150", y ="50")
radekpridej2okna3 = tkinter.Label(okno3, text = "")
radekpridej2okna3.place (x="100", y="150")
tlacitko1okna3 = tkinter.Button(okno3, text = "přidej", command = pridejPenize)
tlacitko1okna3.place (x="175", y ="100")
def pridejPenize():
if jednaSeOCislo(vstuppridej1okno3.get()) == True:
pocetPridej = int(vstuppridej1okno3.get())
if pocetPridej > 0:
vystup = zacni.pridej(pocetPridej)
okno3.destroy()
hlaska = ("Na účet ti bylo přidáno: ", pocetPridej, "KČ")
vystup1okna2.config(text=hlaska, fg="green", font=("Calibri", 15))
historiePrevod = str(pocetPridej)
historieLokal = "+" + historiePrevod
historie.append(historieLokal)
else:
okno3.destroy()
hlaska = ("Zadal jsi zápornou hodnotu. Opakuj akci.")
vystup1okna2.config(text=hlaska, fg="red", font=("Calibri", 15))
else:
okno3.destroy()
hlaska = ("Nezadal jsi číslo. Opakuj akci.")
vystup1okna2.config(text=hlaska, fg="red", font=("Calibri", 15))
def odeberPenizeKostra():
global vstuppridej1okno4
global okno4
okno4 = tkinter.Tk()
okno4.geometry("400x150")
nazev1okna4 = tkinter.Label(okno4, text = "Zde si můžeš z účtu vybrat peníze")
nazev1okna4.place (x="100", y="10")
radekpridej1okna4 = tkinter.Label(okno4, text = "Kolik chceš odebrat:")
radekpridej1okna4.place (x="30", y="50")
vstuppridej1okno4 = tkinter.Entry(okno4)
vstuppridej1okno4.place (x="160", y ="50")
radekpridej2okna4 = tkinter.Label(okno4, text = "")
radekpridej2okna4.place (x="100", y="150")
tlacitko1okna4 = tkinter.Button(okno4, text = "odeber", command = odeberPenize)
tlacitko1okna4.place (x="175", y ="100")
def odeberPenize():
if jednaSeOCislo(vstuppridej1okno4.get()) == True:
pocet = int(vstuppridej1okno4.get())
vstup = zacni.odeber(pocet)
if vstup == True:
okno4.destroy()
hlaska = ("Vybral jsi: ", pocet, "Kč")
vystup1okna2.config(text=hlaska, fg="green", font=("Calibri", 15))
historiePrevod = str(pocet)
historieLokal = "-" + historiePrevod
historie.append(historieLokal)
else:
okno4.destroy()
hlaska = ("Nemáš dostatek peněz na účtě. Opakuj akci.")
vystup1okna2.config(text=hlaska, fg="red", font=("Calibri", 15))
else:
okno4.destroy()
hlaska = ("Nezadal jsi číslo. Opakuj akci.")
vystup1okna2.config(text=hlaska, fg="red", font=("Calibri", 15))
def historieOperaci():
delkaSeznamu = len(historie)
if delkaSeznamu == 0:
okno7 = tkinter.Tk()
okno7.geometry("400x200")
nazev1okna7 = tkinter.Label(okno7, text = "Zatím nebyli provedeny žádné operace", fg="red", font=("Calibri", 15))
nazev1okna7.place (x="70", y="10")
else:
y = 50
delkaOkna = str(100 + (30*len(historie)))
delkaOknaPrevod = "400x"+ delkaOkna
okno7 = tkinter.Tk()
okno7.geometry(delkaOknaPrevod)
nazev1okna7 = tkinter.Label(okno7, text = "Zde vidíte seznam všech provedených operací", fg="black", font=("Calibri", 15))
nazev1okna7.place (x="40", y="10")
for i in historie:
radek1okna7 = tkinter.Label(okno7, text = i)
radek1okna7.place (x="30", y=y)
y = y + 30
def poslatPenizeKostra():
global vstuppridej1okno12
global vstuppridej2okno12
global okno12
global radekpridej4okna12
okno12 = tkinter.Tk()
okno12.geometry("400x210")
nazev1okna12 = tkinter.Label(okno12, text = "Tady můžeš poslat penze na jiný účet")
nazev1okna12.place (x="90", y="10")
radekpridej1okna12 = tkinter.Label(okno12, text = "Zadej číslo účtu")
radekpridej1okna12.place (x="30", y="50")
vstuppridej1okno12 = tkinter.Entry(okno12)
vstuppridej1okno12.place (x="135", y ="50")
radekpridej2okna12 = tkinter.Label(okno12, text = "Zadej částku")
radekpridej2okna12.place (x="45", y="100")
vstuppridej2okno12 = tkinter.Entry(okno12)
vstuppridej2okno12.place (x="135", y ="100")
radekpridej4okna12 = tkinter.Label(okno12, text = "")
radekpridej4okna12.place (x="100", y="135")
tlacitko1okna12 = tkinter.Button(okno12, text = "Poslat peníze", command = poslatPenize)
tlacitko1okna12.place (x="150", y ="175")
def poslatPenize():
if jednaSeOCislo(vstuppridej1okno12.get()) == True:
ucet = int(vstuppridej1okno12.get())
if ucet in ucty:
ucetporadi = ucty.index(ucet)
if jednaSeOCislo(vstuppridej2okno12.get()) == True:
pocetPenez = int(vstuppridej2okno12.get())
vystup = zacni.posli(pocetPenez)
if vystup == True:
castka = penize[ucetporadi]
castka = castka + pocetPenez
penize.pop(ucetporadi)
penize.insert(ucetporadi, castka)
okno12.destroy()
vystup1okna2.config(text="Operace proběhla v pořádku", fg="green", font=("Calibri", 15))
else:
radekpridej4okna12.config(text="Na účtě nemáš dostatek peněz", fg="red", font=("Calibri", 15))
else:
radekpridej4okna12.config(text="Nezadal jsi pěněžní hodnotu v čislech", fg="red", font=("Calibri", 15))
else:
radekpridej4okna12.config(text="Zadal jsi neplatný účet", fg="red", font=("Calibri", 15))
else:
radekpridej4okna12.config(text="Nezadal jsi číslo účtu správně", fg="red", font=("Calibri", 15))
def odhlasit():
okno2.destroy()
historie.clear()
uvodniOkno()
def adminUcet():
adminUcet = vstup1okno8.get()
if adminUcet in adminUcty:
global adminpinporadi
adminpinporadi = adminUcty.index(adminUcet)
adminPin()
else:
adminSpatne()
def adminPin():
if jednaSeOCislo(vstup2okno8.get()) == True:
pin = int(vstup2okno8.get())
if pin == adminPiny[adminpinporadi]:
okno8.destroy()
adminZakladniKostra()
else:
adminSpatne()
else:
radek3okna8.config(text="Do pinu jsi nezadal číslo", fg="red", font=("Calibri", 15))
def adminSpatne():
radek3okna8.config(text="Zadal jsi špatné údaje zkus to znovu", fg="red", font=("Calibri", 15))
def adminPrihlaseni():
global vstup2okno8
global vstup1okno8
global radek3okna8
global okno8
okno1.destroy()
okno8 = tkinter.Tk()
okno8.geometry("400x450")
canvas = tkinter.Canvas(okno8)
canvas.pack()
canvas.create_polygon(0, 70, 100, 70, 200, 20, fill="red")
canvas.create_polygon(0, 70, 100, 70, 200, 120, fill="red")
canvas.create_polygon(280, 70, 120, 70, 200, 120, fill="blue")
canvas.create_polygon(280, 70, 120, 70, 200, 20, fill="blue")
bankaokna8 = tkinter.Label(okno8, text = "Česká banka", font=("Arial Bold", 35))
bankaokna8.place (x="90", y="130")
nazevokna8 = tkinter.Label(okno8, text = "Zadejte své přihlašovací údaje pro vstup do admin režimu")
nazevokna8.place (x="20", y="210")
radek1okna8 = tkinter.Label(okno8, text = "Přihlašovací jméno:")
radek1okna8.place (x="25", y="250")
radek2okna8 = tkinter.Label(okno8, text = "Heslo:")
radek2okna8.place (x="105", y="300")
vstup1okno8 = tkinter.Entry(okno8)
vstup1okno8.place (x="150", y ="250")
vstup2okno8 = tkinter.Entry(okno8)
vstup2okno8.place (x="150", y ="300")
tlacitko1okna8 = tkinter.Button(okno8, text = "přihlásit se", command = adminUcet)
tlacitko1okna8.place (x="120", y ="350")
tlacitko2okna8 = tkinter.Button(okno8, text = "běžné přihlášení", command = adminZpatky)
tlacitko2okna8.place (x="210", y ="350")
radek3okna8 = tkinter.Label(okno8, text = "")
radek3okna8.place (x="100", y="400")
def adminZpatky():
okno8.destroy()
uvodniOkno()
def adminZakladniKostra():
global okno9
global vystup1okna9
okno9 = tkinter.Tk()
okno9.geometry("400x550")
canvas = tkinter.Canvas(okno9)
canvas.pack()
canvas.create_polygon(0, 70, 100, 70, 200, 20, fill="red")
canvas.create_polygon(0, 70, 100, 70, 200, 120, fill="red")
canvas.create_polygon(280, 70, 120, 70, 200, 120, fill="blue")
canvas.create_polygon(280, 70, 120, 70, 200, 20, fill="blue")
bankaokna9 = tkinter.Label(okno9, text = "Česká banka", font=("Arial Bold", 35))
bankaokna9.place (x="90", y="130")
nazev1okna9 = tkinter.Label(okno9, text = "Vítej administrátorském účtu")
nazev1okna9.place (x="110", y="180")
nazev2okna9 = tkinter.Label(okno9, text = "Vyber možnost co chceš udělat")
nazev2okna9.place (x="100", y="200")
tlacitko1okna9 = tkinter.Button(okno9, text = "Chceš přidat účet", command = pridatUcetUcet)
tlacitko1okna9.place (x="145", y ="250")
tlacitko2okna9 = tkinter.Button(okno9, text = "Zajímá tě kolik je dohromady na účtech peněz", command = soucetPenez)
tlacitko2okna9.place (x="65", y ="300")
tlacitko3okna9 = tkinter.Button(okno9, text = "Zajímá tě kolik je ve tvé bance celkem účtů", command = pocetUctu)
tlacitko3okna9.place (x="75", y ="350")
tlacitko4okna9 = tkinter.Button(okno9, text = "Vypiš čísla účtů", command = vypisCislaUctu)
tlacitko4okna9.place (x="150", y ="400")
tlacitko5okna9 = tkinter.Button(okno9, text = "Odhlásit se", command = adminOdhlasit)
tlacitko5okna9.place (x="165", y ="450")
vystup1okna9 = tkinter.Label(okno9, text = "")
vystup1okna9.place (x="100", y="500")
def adminOdhlasit():
okno9.destroy()
uvodniOkno()
def pridatUcetUcet():
global vstuppridej1okno10
global vstuppridej2okno10
global vstuppridej3okno10
global okno10
global radekpridej4okna10
okno10 = tkinter.Tk()
okno10.geometry("400x300")
nazev1okna10 = tkinter.Label(okno10, text = "Tato aplikace ti odebere peníze z účtu")
nazev1okna10.place (x="90", y="10")
radekpridej1okna10 = tkinter.Label(okno10, text = "Zadej číslo účtu")
radekpridej1okna10.place (x="70", y="50")
vstuppridej1okno10 = tkinter.Entry(okno10)
vstuppridej1okno10.place (x="180", y ="50")
radekpridej2okna10 = tkinter.Label(okno10, text = "Zadej Pin")
radekpridej2okna10.place (x="110", y="100")
vstuppridej2okno10 = tkinter.Entry(okno10)
vstuppridej2okno10.place (x="180", y ="100")
radekpridej3okna10 = tkinter.Label(okno10, text = "Zadej počáteční zůstatek")
radekpridej3okna10.place (x="20", y="150")
vstuppridej3okno10 = tkinter.Entry(okno10)
vstuppridej3okno10.place (x="180", y ="150")
radekpridej4okna10 = tkinter.Label(okno10, text = "")
radekpridej4okna10.place (x="100", y="200")
tlacitko1okna10 = tkinter.Button(okno10, text = "přidej", command = pridatUcetOvereniUctu)
tlacitko1okna10.place (x="175", y ="250")
def pridatUcetOvereniUctu():
if jednaSeOCislo(vstuppridej1okno10.get()) == True:
ucet = int(vstuppridej1okno10.get())
if ucet in ucty:
radekpridej4okna10.config(text="Zadal jsi již existující číslo účtu", fg="red", font=("Calibri", 15))
else:
if jednaSeOCislo(vstuppridej2okno10.get()) == True:
if jednaSeOCislo(vstuppridej3okno10.get()) == True:
if int(vstuppridej3okno10.get()) > 0:
ucty.append(int(vstuppridej1okno10.get()))
piny.append(int(vstuppridej2okno10.get()))
penize.append(int(vstuppridej3okno10.get()))
okno10.destroy()
vystup1okna9.config(text="Účet byl přidán", fg="green", font=("Calibri", 15))
else:
radekpridej4okna10.config(text="Zůstatek nesmí být záporný", fg="red", font=("Calibri", 15))
else:
radekpridej4okna10.config(text="Zůstatek musí být číslo", fg="red", font=("Calibri", 15))
else:
radekpridej4okna10.config(text="Pin musí být číslo", fg="red", font=("Calibri", 15))
else:
radekpridej4okna10.config(text="Nezadal jsi číslo do čísla účtu", fg="red", font=("Calibri", 15))
def vypisCislaUctu():
y = 50
delkaOkna = str(100 + (30*len(ucty)))
delkaOknaPrevod = "400x"+ delkaOkna
okno11 = tkinter.Tk()
okno11.geometry(delkaOknaPrevod)
nazev1okna11 = tkinter.Label(okno11, text = "Zde vidíte seznam všech účtů")
nazev1okna11.place (x="110", y="10")
for i in ucty:
radek1okna11 = tkinter.Label(okno11, text = i)
radek1okna11.place (x="30", y=y)
y = y + 30
def soucetPenez():
soucet = 0
for i in penize:
soucet = soucet + i
text = ("Dohromady na účtech je: ", soucet)
vystup1okna9.config(text= text, fg="black", font=("Calibri", 15))
def pocetUctu():
pocet = len(ucty)
if pocet == 0:
text = ("V bance je celkem: ", pocet, " účtů")
elif pocet == 1:
text = ("V bance je celkem: ", pocet, " účet")
elif pocet == 2:
text = ("V bance jsou celkem: ", pocet, " účty")
elif pocet == 3:
text = ("V bance jsou celkem: ", pocet, " účty")
elif pocet == 4:
text = ("V bance jsou celkem: ", pocet, " účty")
else:
text = ("V bance je celkem: ", pocet, " účtů")
vystup1okna9.config(text= text, fg="black", font=("Calibri", 15))
def ucet():
if jednaSeOCislo(vstup1okno1.get()) == True:
ucet = int(vstup1okno1.get())
if ucet in ucty:
global pinporadi
pinporadi = ucty.index(ucet)
pin()
else:
spatne()
else:
radek3okna1.config(text="Do čísla účtu jsi nezadal číslo", fg="red", font=("Calibri", 15))
def pin():
if jednaSeOCislo(vstup2okno1.get()) == True:
pin = int(vstup2okno1.get())
if pin == piny[pinporadi]:
okno1.destroy()
global zacni
zacni = Pocitani(penize[pinporadi], pinporadi)
zakladniKostra()
else:
spatne()
else:
radek3okna1.config(text="Do pinu jsi nezadal číslo", fg="red", font=("Calibri", 15))
def spatne():
radek3okna1.config(text="Zadal jsi špatné údaje zkus to znovu", fg="red", font=("Calibri", 15))
def uvodniOkno():
global okno1
global vstup1okno1
global vstup2okno1
global radek3okna1
okno1 = tkinter.Tk()
okno1.geometry("400x450")
canvas = tkinter.Canvas(okno1)
canvas.pack()
canvas.create_polygon(0, 70, 100, 70, 200, 20, fill="red")
canvas.create_polygon(0, 70, 100, 70, 200, 120, fill="red")
canvas.create_polygon(280, 70, 120, 70, 200, 120, fill="blue")
canvas.create_polygon(280, 70, 120, 70, 200, 20, fill="blue")
bankaokna1 = tkinter.Label(okno1, text = "Česká banka", font=("Arial Bold", 35))
bankaokna1.place (x="90", y="130")
nazevokna1 = tkinter.Label(okno1, text = "Zadejte své přihlašovací údaje")
nazevokna1.place (x="100", y="210")
radek1okna1 = tkinter.Label(okno1, text = "Číslo účtu:")
radek1okna1.place (x="30", y="250")
radek2okna1 = tkinter.Label(okno1, text = "Pin:")
radek2okna1.place (x="70", y="300")
vstup1okno1 = tkinter.Entry(okno1)
vstup1okno1.place (x="100", y ="250")
vstup2okno1 = tkinter.Entry(okno1)
vstup2okno1.place (x="100", y ="300")
tlacitko1okna1 = tkinter.Button(okno1, text = "přihlásit se", command = ucet)
tlacitko1okna1.place (x="120", y ="350")
tlacitko2okna1 = tkinter.Button(okno1, text = "admin", command = adminPrihlaseni)
tlacitko2okna1.place (x="210", y ="350")
radek3okna1 = tkinter.Label(okno1, text = "")
radek3okna1.place (x="100", y="400")
uvodniOkno()
and I got an assignment that I have: The design of the application is wrong, because you use the class Pocitani, but you create a single object from this class. Important data of the application is contained in the lists of honor, pin, money. This contradicts not only the assignment of the project, but above all the principle of object-oriented programming. Fix the project so that there is a single account list that will contain all accounts as instances of the Ucet class. This Account class will be created from your Account class, but it will also contain the account number, account pin and account history (this will not be deleted when you log out of the account).
How can I solve this problem?
How can I solve this problem?
I have all the gui configurations and all that stuff in my main.py and my algorithms to draw bubble sort and merge sort in another .py file. I'm trying to write the print functions into my canvas but I'm not sure how to do it, can anyone help? I tried using a ListBox() but it messes up the main canvas for some reason.
This is my code for my main file:
from tkinter import *
from tkinter import ttk
from tkinter import messagebox
from bubbleSort import bubbleSort
from mergeSort import mergeSort
tk = Tk()
tk.title('Examen Final')
tk.maxsize(900, 600)
tk.config(bg = 'black')
algoritmo = StringVar()
data = []
def dibujar(data, color):
c.delete("all")
cHeight = 380
cWidth = 600
algoWidth = cWidth / (len(data) + 1)
algoHeight = cWidth / (len(data) + 1)
offset = 20
spacing = 10
tamData = [i / max(data) for i in data]
for i, height in enumerate(tamData):
x0 = i * algoWidth + offset + spacing
y0 = cHeight - height * 50
x1 = (i+1) * algoWidth + offset
y1 = cHeight
c.create_oval(x0,y0,x1,y1, fill = color[i])
c.create_text(x0+2,y0, anchor = SW, text=str(data[i]))
tk.update_idletasks()
def Ordenar():
print("Se selecciono: " + algoritmo.get())
print("Iniciando algoritmo")
global data
if menu.get() == 'MERGE SORT':
mergeSort(data, dibujar)
elif menu.get() == 'BUBBLE SORT':
bubbleSort(data, dibujar)
dibujar(data, ['green' for x in range(len(data))])
def agregar():
global data
input = int(inputVal.get())
inputVal.delete(0, END)
try:
print("valor input:")
print(input)
data.append((input))
print(str(data))
dibujar(data, ['red' for x in range(len(data))])
except:
messagebox.showerror("Error", "Ingrese un valor numerico")
def limpiar():
global data
data = []
c.delete("all")
print(data)
box = Frame(tk, width = 600, height = 200, bg = 'black' )
box.grid(row = 0, column = 0, padx=10, pady=5)
c = Canvas(tk, width = 600, height = 380, bg = 'grey')
c.grid(row = 1, column = 0, padx=10, pady=5)
c2 = Canvas(tk, width = 200, height = 380, bg = 'grey')
c2.grid(row = 1, column = 1, padx=10, pady=5)
label = Label(box, text='Lista Algoritmos: ', font = ("Arial",15), borderwidth=1, bg = "black" , fg = 'white')
label.grid(row=0,column=0, padx=5, pady=5, sticky = W)
menu = ttk.Combobox(box, textvariable = algoritmo, values=['BUBBLE SORT', 'MERGE SORT', 'HASH TABLES', 'ARBOL AVL', 'ARBOLES ROJO Y NEGRO'])
menu.grid(row=0, column=1, padx=5, pady=5)
menu.current(0)
botonStart = Button(box, text = 'Ordenar', command = Ordenar, bg = 'lime green')
botonStart.grid(row = 0, column = 2, padx = 5, pady = 5)
label = Label(box, text='Insertar valor: ', font = ("Arial",15), borderwidth=1, bg = "black" , fg = 'white')
label.grid(row=1,column=0, padx = 5, pady = 5, sticky = W)
inputVal = Entry(box)
inputVal.grid(row=1,column=1, padx = 5, pady = 5, sticky = W)
botonAdd = Button(box, text = 'Agregar', command = agregar, bg = 'lime green')
botonAdd.grid(row = 1, column = 2, padx = 5, pady = 5, sticky = W)
botonClear = Button(box, text = 'Limpiar', command = limpiar, bg = 'lime green')
botonClear.grid(row = 1, column = 3, padx = 5, pady = 5, sticky = W)
tk.mainloop()
and this is my bubbleSort.py
import time
def bubbleSort(data, dibujar):
for _ in range(len(data)-1):
for j in range(len(data)-1):
if data[j] > data[j+1]:
print(("El numero " + str(data[j]) + " es mayor que " + str(data[j+1])))
data[j],data[j+1] = data[j+1], data[j]
print(("Intercambiando de lugar " + str(data[j]) + " con " + str(data[j+1])))
dibujar(data,
[
'green'
if x == j or x == j+1
else 'red' for x in range(len(data))
]
)
time.sleep(1)
dibujar(data, ['green' for x in range(len(data))])
You can just pass in c2 to the function on the other file. So first define the parameter:
def bubbleSort(data, dibujar, cnv):
cnv.create_text(100,100,text='Trial Text')
....
Now each time you call this function, pass on c2 to it.
if menu.get() == 'BUBBLE SORT':
bubbleSort(data, dibujar, c2)
I did notice that you are using dynamic points for calculation, if so, make those points global, inside the function, then pass those onto the function by creating more parameter, while keeping in mind that the points have to defined before the function is called.
I am a GCSE student in year 10 so I have only just started my course and proper coding. We were set a task to create a game called botmod where you control a character that collects people then returns them to a base. I created the game fine using general knowledge and getting help from Google for what I didn't understand. Once I finished the main program I started on creating a start menu where the user can set their own variables for the game such as grid size etc. once I had implemented this with the main program this is where the issue began.
Once I go through both menus and select all options the program stops responding then crashes.
I am aware this code is extremely messy and that I should not be using global variables or at least be avoiding them as much as possible but we haven't properly started OOP yet so I decided against diving into it.
Thank you in advance for the help.
from tkinter import *
from random import choice, shuffle
def Ending_Conditions():
global Player_Power, Players_Collected
if Players_Collected == 3:
Game_End("YOU WIN!")
elif Player_Power <= 0 and Players_Collected != 3:
Game_End("Game Over")
def Game_End(End_Option):
global Playing_Game, Game_Finished
if End_Option == "EXIT":
Playing_Game = False
Root.destroy()
else:
Game_Finished = True
Game_Canvas.create_rectangle(120, 120, 480, 300, fill = "#ffffff")
Game_Canvas.create_text(300, 210, text = End_Option, font = ('Abadi', 35, "bold"))
Continue_Button = Button(Root, text = 'Continue', command = lambda: Game_Restart('CONTINUE'))
Exit_Button = Button(Root, text = 'Exit', command = lambda: Game_Restart('EXIT'))
Continue_Button.pack()
Exit_Button.pack()
def Game_Restart(Restart_Option):
if Restart_Option == 'CONTINUE':
Root.destroy()
Restart_Game = True
if Restart_Option == 'EXIT':
Game_End('EXIT')
def Paused_UI():
global Game_Paused, Close_PausedUI
Close_PausedUI = Button(Root, text = 'Exit', command = Close_Paused_UI)
Close_PausedUI.pack()
Game_Paused = True
def Close_Paused_UI():
global Game_Paused, Close_PausedUI
Close_PausedUI.pack_forget()
Game_Paused = False
def Generate_Game():
global Game_Canvas, Game_Player, Game_Base, Player_Power, Power_Counter, People_Locations, Game_Paused, All_People, Game_Grid
Current_Colour = 0
Grid_Colour = []
Player_PosX, Player_PosY, Player_Storage, Players_Collected = 30, 30, 0, 0,
People_Locations = {0:[150, 450, 0], 1:[270, 330, 1], 2:[450, 90, 2]}
Game_Finished = False
# Generate UI
Game_Menu = Button(Root, text = 'Menu', command = Paused_UI)
Game_Menu.pack()
# Define grid colours
Grid_Colours = ['#009446', '#D4F0FF', '#5f6365']
# Generate power counter and pack canvas
Power_Counter = Label(Root, text = Player_Power)
Power_Counter.pack()
Game_Canvas.pack()
# Generate Grid and Colours
for y in range(Game_Grid):
for x in range(Game_Grid):
shuffle(Grid_Colours)
Game_Grid = Game_Canvas.create_rectangle(0+60*x, 0+60*y, 60+60*x, 60+60*y, fill = Grid_Colours[0])
Grid_Colour.append(Grid_Colours[0])
# Generate Robot Player
Game_Player = Game_Canvas.create_text(Player_PosX, Player_PosY, text = "R", font = ('Abadi', 35, "bold"))
# Generate Player Base
Game_Base = Game_Canvas.create_text(450, 330, text = "B", font = ('Abadi', 35, "bold"))
# Generate People
for i in range(Game_People):
Person_Location = People_Locations[0+i]
Game_Person = Game_Canvas.create_text(Person_Location[0], Person_Location[1], text = "P", font = ('Abadi', 35, "bold"), tag = 'Game_Person')
All_People = Game_Canvas.find_withtag('Game_Person')
All_People = list(All_People)
def Move_Player(event):
global Game_Canvas, Game_Player, Game_Base, Player_PosY, Player_PosX, Current_Colour, Player_Power, Power_Counter, Player_Storage, Players_Collected, Game_Finished, Current_Person
if event.char.lower() == '\x1b' and Game_Paused == False:
Paused_UI()
elif event.char.lower() == '\x1b' and Game_Paused == True:
Close_Paused_UI()
if Game_Paused == False and Game_Finished != True:
Movement_Value = Movement_Values[event.char.lower()]
if Player_PosX != Movement_Value[0] and Player_PosY != Movement_Value[1]:
# Detect current grid colour and configure power accordingly
Player_Power = Player_Power - Power_Values[Grid_Colour[Current_Colour]]
Power_Counter.configure(text = Player_Power)
Current_Colour = Current_Colour + Movement_Value[4]
# Delete the player then recreate in its new position
Game_Canvas.delete(Game_Player)
Player_PosX, Player_PosY = Player_PosX + Movement_Value[2], Player_PosY + Movement_Value[3]
Game_Player = Game_Canvas.create_text(Player_PosX, Player_PosY, text = "R", font = ('Abadi', 35, "bold"))
# Detect Person
for item in People_Locations:
Person_Location = People_Locations[item]
if Player_PosX == Person_Location[0] and Player_PosY == Person_Location[1] and Player_Storage != 1:
Current_Person = Person_Location[2]
Game_Canvas.delete(All_People[Current_Person])
Player_Storage += 1
if Player_PosX == 450 and Player_PosY == 330:
if Player_Storage == 1:
Player_Storage -= 1
Players_Collected += 1
Clear_Current = People_Locations[Current_Person]
Clear_Current = Clear_Current[2]
People_Locations.pop(Clear_Current)
Ending_Conditions()
def Start_Game():
global Start_Canvas
Start_Canvas = Canvas(Root, width = 600, height = 500, bd=0, highlightthickness=0, bg = '#ffffff')
Start_Canvas.pack()
Title = Start_Canvas.create_text(300, 163, text = "BOTMOD", font = ('Cinema Gothic BTN Shadow', 75, 'normal'))
Play_Button = Button(text = "PLAY", width = 10, font=('Arial', 15), command = Play_Game)
Play_Button = Start_Canvas.create_window(300, 325, window = Play_Button)
Exit_Button = Button(text = "EXIT", width = 10, font=('Arial', 15), command = lambda: Game_End("EXIT"))
Exit_Button = Start_Canvas.create_window(300, 375, window = Exit_Button)
def Play_Game():
global Menu_Canvas, Grid_Entry, Power_Entry, People_Entry
Start_Canvas.destroy()
Menu_Canvas = Canvas(Root, width = 600, height = 500, bd=0, highlightthickness=0, bg = '#C0C0C0')
Menu_Canvas.pack()
Title_Rectangle = Menu_Canvas.create_rectangle(120, 10, 480, 100, fill = '#000000')
Slider_Rectangle = Menu_Canvas.create_rectangle(120, 110, 480, 430, fill = '#000000')
Footer_Rectangle = Menu_Canvas.create_rectangle(120, 440, 480, 490, fill = '#000000')
Title = Menu_Canvas.create_text(300, 55, text = "BOTMOD", font = ('Cinema Gothic BTN Shadow', 55, 'normal'), fill = '#ffffff')
Description_Text = Label(text = "Set Game Options", font=('Arial', 15, 'bold'), bg = '#000000', fg = '#ffffff')
Description_Text = Menu_Canvas.create_window(300, 145, window = Description_Text)
Power_Text = Label(text = "Robot Power", font=('Cinema Gothic BTN Shadow', 15), bg = '#000000', fg = '#ffffff')
Power_Text = Menu_Canvas.create_window(300, 195, window = Power_Text)
Power_Entry = Scale(from_= 50, to = 350, orient = HORIZONTAL, bg = '#000000', fg = '#ffffff', highlightthickness=0, bd = 0)
Power_Entry = Menu_Canvas.create_window(300, 225, window = Power_Entry)
People_Text = Label(text = "Person Count", font=('Cinema Gothic BTN Shadow', 15), bg = '#000000', fg = '#ffffff')
People_Text = Menu_Canvas.create_window(300, 280, window = People_Text)
People_Entry = Scale(from_= 3, to = 10, orient = HORIZONTAL, bg = '#000000', fg = '#ffffff', highlightthickness=0, bd = 0, state=DISABLED)
People_Entry = Menu_Canvas.create_window(300, 310, window = People_Entry)
Grid_Text = Label(text = "Grid Count", font=('Cinema Gothic BTN Shadow', 15), bg = '#000000', fg = '#ffffff')
Grid_Text = Menu_Canvas.create_window(300, 365, window = Grid_Text)
Grid_Entry = Scale(from_= 5, to = 15, orient = HORIZONTAL, bg = '#000000', fg = '#ffffff', highlightthickness=0, bd = 0)
Grid_Entry = Menu_Canvas.create_window(300, 395, window = Grid_Entry)
Play_Button = Button(text = "OK", width = 15, font=('Cinema Gothic BTN Shadow', 10), command = lambda: Init_Game("DEFAULT"), bg = '#000000', fg = '#ffffff')
Play_Button = Menu_Canvas.create_window(400, 465, window = Play_Button)
PlayWD_Button = Button(text = "Use Defaults", width = 15, font=('Cinema Gothic BTN Shadow', 10), command = lambda: Init_Game("CUSTOM"), bg = '#000000', fg = '#ffffff')
PlayWD_Button = Menu_Canvas.create_window(200, 465, window = PlayWD_Button)
def Init_Game(Game_Options):
global Grid_Count, Player_PosY, Player_PosX, Game_Paused, Game_Finished, Playing_Game, Player_Power, Game_Grid, Player_Movement, Game_People, Game_Canvas, Menu_Canvas, Grid_Entry, Power_Entry, People_Entry, Grid_Rectangle
if Game_Options == "DEFAULT":
Game_Grid = 10
Grid_Rectangle = 600/10
Player_Movement = Grid_Rectangle/2
Player_Power = 150
Game_People = 3
else:
Game_Grid = Grid_Entry.get()
Grid_Rectangle = 600/Game_Grid
Player_Movement = Grid_Rectangle/2
Player_Power = Power_Entry.get()
Game_People = People_Entry.get()
Menu_Canvas.destroy()
Playing_Game = True
Game_Paused = False
Restart_Game = False
Movement_Values = {'w':(1000, 30, 0, -60, -10), 'a':(30, 1000, -60, 0, -1), 's':(1000, 570, 0, 60, 10), 'd':(570, 1000, 60, 0, 1)}
Power_Values = {'#009446':2, '#D4F0FF':1, '#5f6365':3}
People_Locations = {0:[150, 450, 0], 1:[270, 330, 1], 2:[450, 90, 2]}
while Playing_Game == True:
Restart_Game = False
while Restart_Game == False:
if Playing_Game == False:
break
else:
Root = Tk()
Game_Canvas = Canvas(Root, width = 600, height = 600, bd=0, highlightthickness=0)
Generate_Game()
Root.bind('<KeyPress>', Move_Player)
Root.protocol("WM_DELETE_WINDOW", lambda: Game_End("EXIT"))
if Playing_Game == False:
break
Root = Tk()
Start_Game()
Root.mainloop()
Had a look today and it turns out the loops at the bottom were what caused the issue not 100% sure what I did as it was trial and error but I will post the code anyway.
Also that code isn't finished completely yet.
from tkinter import *
from random import choice, shuffle
def Ending_Conditions():
global Player_Power, Players_Collected
if Players_Collected == 3:
Game_End("YOU WIN!")
elif Player_Power <= 0 and Players_Collected != 3:
Game_End("Game Over")
def Game_End(End_Option):
global Playing_Game, Game_Finished
if End_Option == "EXIT":
Playing_Game = False
Root.destroy()
else:
Game_Finished = True
Game_Canvas.create_rectangle(120, 120, 480, 300, fill = "#ffffff")
Game_Canvas.create_text(300, 210, text = End_Option, font = ('Abadi', 35, "bold"))
Continue_Button = Button(Root, text = 'Continue', command = Game_Restart)
Exit_Button = Button(Root, text = 'Exit', command = lambda: Game_End('EXIT'))
Continue_Button.pack()
Exit_Button.pack()
def Game_Restart():
global Already_Played
Root.destroy()
Restart_Game = True
Already_Played = True
def Paused_UI():
global Game_Paused, Close_PausedUI
Close_PausedUI = Button(Root, text = 'Exit', command = Close_Paused_UI)
Close_PausedUI.pack()
Game_Paused = True
def Close_Paused_UI():
global Game_Paused, Close_PausedUI
Close_PausedUI.pack_forget()
Game_Paused = False
def Generate_Game():
global Game_Canvas, Game_Player, Game_Base, Player_Power, Power_Counter, People_Locations, Game_Paused, All_People, Game_Gridcount, Current_Colour, Player_PosY, Player_PosX, Grid_Colour, Players_Collected, Player_Storage
Current_Colour = 0
Grid_Colour = []
Player_PosX, Player_PosY, Player_Storage, Players_Collected, Players_Removed = 300/Game_Gridcount, 300/Game_Gridcount, 0, 0, 0
People_Locations = {0:[150, 450, 0], 1:[270, 330, 1], 2:[450, 90, 2]}
Game_Finished = False
# Generate UI
Game_Menu = Button(Root, text = 'Menu', command = Paused_UI)
Game_Menu.pack()
# Define grid colours
Grid_Colours = ['#009446', '#D4F0FF', '#5f6365']
# Generate power counter and pack canvas
Power_Counter = Label(Root, text = Player_Power)
Power_Counter.pack()
Game_Canvas.pack()
# Generate Grid and Colours
for y in range(Game_Gridcount):
for x in range(Game_Gridcount):
shuffle(Grid_Colours)
Game_Grid = Game_Canvas.create_rectangle(Grid_Rectangle*x, Grid_Rectangle*y, Grid_Rectangle+Grid_Rectangle*x, Grid_Rectangle+Grid_Rectangle*y, fill = Grid_Colours[0])
Grid_Colour.append(Grid_Colours[0])
# Generate Robot Player
Game_Player = Game_Canvas.create_text(Player_PosX, Player_PosY, text = "R", font = ('Abadi', 450//Game_Gridcount, "bold"))
# Generate Player Base
Game_BaseX, Game_BaseY = Grid_Rectangle*(Game_Gridcount-1.5), Grid_Rectangle*(Game_Gridcount-2.5)
Game_Base = Game_Canvas.create_text(Game_BaseX, Game_BaseY, text = "B", font = ('Abadi', 450//Game_Gridcount, "bold"))
# Generate People
for i in range(Game_People):
Person_Location = People_Locations[i] Grid_Rectangle*(Game_Gridcount-1.5)
Game_Person = Game_Canvas.create_text(Grid_Rectangle*(Game_Gridcount-Person_Location[0]), (Grid_Rectangle*(Game_Gridcount-Person_Location[1]), text = "P", font = ('Abadi', 450//Game_Gridcount, "bold"), tag = 'Game_Person')
All_People = Game_Canvas.find_withtag('Game_Person')
All_People = list(All_People)
def Move_Player(event):
global Game_Canvas, Game_Player, Game_Base, Player_PosY, Player_PosX, Current_Colour, Player_Power, Power_Counter, Player_Storage, Players_Collected, Game_Finished, Current_Person
if event.char.lower() == '\x1b' and Game_Paused == False:
Paused_UI()
elif event.char.lower() == '\x1b' and Game_Paused == True:
Close_Paused_UI()
if Game_Paused == False and Game_Finished != True:
Movement_Value = Movement_Values[event.char.lower()]
if Player_PosX != Movement_Value[0] and Player_PosY != Movement_Value[1]:
# Detect current grid colour and configure power accordingly
Player_Power = Player_Power - Power_Values[Grid_Colour[Current_Colour]]
Power_Counter.configure(text = Player_Power)
Current_Colour = Current_Colour + Movement_Value[4]
# Delete the player then recreate in its new position
Game_Canvas.delete(Game_Player)
Player_PosX, Player_PosY = Player_PosX + Movement_Value[2], Player_PosY + Movement_Value[3]
Game_Player = Game_Canvas.create_text(Player_PosX, Player_PosY, text = "R", font = ('Abadi', 450//Game_Gridcount, "bold"))
# Detect Person
for item in People_Locations:
Person_Location = People_Locations[item]
if Player_PosX == Person_Location[0] and Player_PosY == Person_Location[1] and Player_Storage != 1:
Current_Person = Person_Location[2]
Game_Canvas.delete(All_People[Current_Person])
Player_Storage += 1
if Player_PosX == 450 and Player_PosY == 330:
if Player_Storage == 1:
Player_Storage -= 1
Players_Collected += 1
Clear_Current = People_Locations[Current_Person]
Clear_Current = Clear_Current[2]
People_Locations.pop(Clear_Current)
Ending_Conditions()
def Start_Game():
global Start_Canvas
Start_Canvas = Canvas(Root, width = 600, height = 500, bd=0, highlightthickness=0, bg = '#ffffff')
Start_Canvas.pack()
Title = Start_Canvas.create_text(300, 163, text = "BOTMOD", font = ('Cinema Gothic BTN Shadow', 75, 'normal'))
Play_Button = Button(text = "PLAY", width = 10, font=('Arial', 15), command = Play_Game)
Play_Button = Start_Canvas.create_window(300, 325, window = Play_Button)
Exit_Button = Button(text = "EXIT", width = 10, font=('Arial', 15), command = lambda: Game_End("EXIT"))
Exit_Button = Start_Canvas.create_window(300, 375, window = Exit_Button)
def Play_Game():
global Menu_Canvas, Grid_Entry, Power_Entry, People_Entry
if Already_Played == False:
Start_Canvas.destroy()
Menu_Canvas = Canvas(Root, width = 600, height = 500, bd=0, highlightthickness=0, bg = '#C0C0C0')
Menu_Canvas.pack()
Title_Rectangle = Menu_Canvas.create_rectangle(120, 10, 480, 100, fill = '#000000')
Slider_Rectangle = Menu_Canvas.create_rectangle(120, 110, 480, 430, fill = '#000000')
Footer_Rectangle = Menu_Canvas.create_rectangle(120, 440, 480, 490, fill = '#000000')
Title = Menu_Canvas.create_text(300, 55, text = "BOTMOD", font = ('Cinema Gothic BTN Shadow', 55, 'normal'), fill = '#ffffff')
Description_Text = Label(text = "Set Game Options", font=('Arial', 15, 'bold'), bg = '#000000', fg = '#ffffff')
Description_Text = Menu_Canvas.create_window(300, 145, window = Description_Text)
Power_Text = Label(text = "Robot Power", font=('Cinema Gothic BTN Shadow', 15), bg = '#000000', fg = '#ffffff')
Power_Text = Menu_Canvas.create_window(300, 195, window = Power_Text)
Power_Entry = Scale(Root, from_= 50, to = 350, orient = HORIZONTAL, bg = '#000000', fg = '#ffffff', highlightthickness=0, bd = 0)
Power_Entrys = Menu_Canvas.create_window(300, 225, window = Power_Entry)
People_Text = Label(text = "Person Count", font=('Cinema Gothic BTN Shadow', 15), bg = '#000000', fg = '#ffffff')
People_Text = Menu_Canvas.create_window(300, 280, window = People_Text)
People_Entry = Scale(Root, from_= 2, to = 10, orient = HORIZONTAL, bg = '#000000', fg = '#ffffff', highlightthickness=0, bd = 0)
People_Entrys = Menu_Canvas.create_window(300, 310, window = People_Entry)
Grid_Text = Label(text = "Grid Count", font=('Cinema Gothic BTN Shadow', 15), bg = '#000000', fg = '#ffffff')
Grid_Text = Menu_Canvas.create_window(300, 365, window = Grid_Text)
Grid_Entry = Scale(Root, from_= 6, to = 14, orient = HORIZONTAL, resolution = 2, bg = '#000000', fg = '#ffffff', highlightthickness=0, bd = 0)
Grid_Entrys = Menu_Canvas.create_window(300, 395, window = Grid_Entry)
Play_Button = Button(text = "OK", width = 15, font=('Cinema Gothic BTN Shadow', 10), command = lambda: Init_Game("CUSTOM"), bg = '#000000', fg = '#ffffff')
Play_Button = Menu_Canvas.create_window(400, 465, window = Play_Button)
PlayWD_Button = Button(text = "Use Defaults", width = 15, font=('Cinema Gothic BTN Shadow', 10), command = lambda: Init_Game("DEFAULT"), bg = '#000000', fg = '#ffffff')
PlayWD_Button = Menu_Canvas.create_window(200, 465, window = PlayWD_Button)
def Init_Game(Game_Options):
global Player_PosY, Player_PosX, Game_Paused, Game_Finished, Playing_Game, Player_Power, Game_Gridcount, Player_Movement, Game_People, Game_Canvas, Movement_Values, Power_Values, Grid_Rectangle
if Game_Options == "DEFAULT":
Game_Gridcount = 10
Grid_Rectangle = 600/10
Player_Movement = Grid_Rectangle/2
Player_Power = 150
Game_People = 3
elif Game_Options == "CUSTOM":
Game_Gridcount = Grid_Entry.get()
Grid_Rectangle = 600/Game_Gridcount
Player_Movement = Grid_Rectangle/2
Player_Power = Power_Entry.get()
Game_People = People_Entry.get()
Movement_Values = {'w':(1000, 300/Game_Gridcount, 0, -600/Game_Gridcount, 10), 'a':(300/Game_Gridcount, 1000, -600/Game_Gridcount, 0, -1), 's':(1000, 600-Player_Movement, 0, 600/Game_Gridcount, Game_Gridcount-Game_Gridcount*2), 'd':(600-Player_Movement, 1000, 600/Game_Gridcount, 0, 1)}
Power_Values = {'#009446':2, '#D4F0FF':1, '#5f6365':3}
People_Locations = {0:[1.5, 1.5, 0], 1:[1.5, 4.5, 1], 2:[1.5, 1.5, 2], 3:[1.5, 1.5, 3], 4:[1.5, 1.5, 4], 5:[1.5, 1.5, 5], 6:[1.5, 1.5, 6], 7:[1.5, 1.5, 7], 8:[1.5, 1.5, 8], 9:[1.5, 1.5, 9], 10:[1.5, 1.5, 10]}
Menu_Canvas.destroy()
Game_Canvas = Canvas(Root, width = 600, height = 600, bd=0, highlightthickness=0)
Generate_Game()
Root.bind('<KeyPress>', Move_Player)
Root.protocol("WM_DELETE_WINDOW", lambda: Game_End("EXIT"))
Playing_Game = True
Game_Paused = False
Restart_Game = False
Already_Played = False
while True:
while Restart_Game == False:
if Playing_Game == False:
break
else:
Game_Finished = False
Grid_Colour = []
Power_Values = {'#009446':2, '#D4F0FF':1, '#5f6365':3}
Root = Tk()
if Already_Played == True:
Play_Game()
Root.mainloop()
elif Already_Played == False:
Start_Game()
Root.mainloop()
break
I have a long chunk of code. I do not want to paste it all here, so let me explain what I am trying to accomplish here. Based on a number provided by the user I want to create that many text boxes and then get what is entered into that text box and insert that into the dictionary. I have tried this a few ways and just cannot get it to work correctly. The list is either empty or it only contains the last text box as the value for each key.
def multiple_choice():
def add():
top.destroy()
top = Tk()
top.title("Add Question")
w = 800
h = 800
ws = top.winfo_screenwidth()
hs = top.winfo_screenheight()
x = (ws/2) - (w/2)
y = (hs/2) - (h/2)
top.geometry('%dx%d+%d+%d' % (w, h, x, y))
question = Label(top, text="Question to be asked?", font = "Times 14 bold", fg = "blue")
question.grid(row = 2, column = 4)
questionText = Text(top, borderwidth = 5, width=50,height=5, wrap=WORD, background = 'grey')
questionText.grid(row = 3, column = 4)
numQuestions = Label(top, text = "Number of answer choices?", font = "Times 14 bold", fg = "blue")
numQuestions.grid(row = 4, column=4)
num = Entry(top, bd = 5)
num.grid(row=5, column = 4)
answerList = {}
def multiple():
def preview():
preview = Tk()
top.title("Question Preview")
w = 500
h = 500
ws = top.winfo_screenwidth()
hs = top.winfo_screenheight()
x = (ws/2) - (w/2)
y = (hs/2) - (h/2)
top.geometry('%dx%d+%d+%d' % (w, h, x, y))
title = Label(preview, text = "Short Answer Question Preview", font = "Times 18 bold", fg = "blue" )
title.grid(row = 0, column = 2)
qtext = "Question text will read: "
ques = Label(preview, text = qtext)
ques.grid(row=1, column = 2)
ques2 = Label( preview, text = questionText.get("1.0",END))
let = 'A'
i = 1
for word in answerList:
prev = let + ": " + word
ans = Label(preview, text = prev)
ans.grid(row=1+i, column = 2)
let = chr(ord(let) + 1)
answerCor = "The correct answer(s): "
a = Label(preview, text = answerCor)
a.grid(row=4, column = 2)
b = Label(preview, text = cor.get)
b.grid(row=5, column = 2)
if num.get().isdigit():
number = int(num.get())
AnswerChoices = Label(top, text = "Answer Choices?", font = "Times 14 bold", fg = "blue")
AnswerChoices.grid(row = 6, column=4)
i = 0
let = 'A'
while i < number:
letter = Label(top, text = let)
letter.grid(row = 8+(i*4), column = 3)
answer = Text(top, borderwidth = 5, width=50, height=3, wrap=WORD, background = 'grey')
answer.grid(row = 8+(i*4), column = 4)
answerList[let] = answer.get("1.0",END)
i = i+1
let = chr(ord(let) + 1)
print answerList
correct = Label(top, text = "Correct Answer(s) (seperated by commas)",
font = "Times 14 bold", fg = "blue")
correct.grid(row =99 , column=4)
cor = Text(top, borderwidth = 5, width=50, height=3, wrap=WORD, background = 'grey')
cor.grid(row=100, column = 4)
else:
error = Tk()
w = 500
h = 100
ws = top.winfo_screenwidth()
hs = top.winfo_screenheight()
x = (ws/2) - (w/2)
y = (hs/2) - (h/2)
error.geometry('%dx%d+%d+%d' % (w, h, x, y))
text = "ERROR: You must enter an integer number"
Label(error,text = text, fg = "red", font = "Times 16 bold").pack()
MyButton5 = Button(top, text="Preview Question", width=20, command = preview, anchor=S)
MyButton5.grid(row=102, column=5)
MyButton4 = Button(top, text="Finish and Add Question", width=20, command = add, anchor=S)
MyButton4.grid(row=102, column=2)
but = Button(top, text="Submit", width=10, command = multiple)
but.grid(row=6, column = 4)
top.mainloop()
def button():
MyButton21 = Button(quiz, text="Short Answer Question", width=20, command = short_answer)
MyButton21.grid(row=8, column=2)
MyButton22 = Button(quiz, text="True/False Question", width=20, command = true_false)
MyButton22.grid(row=8, column=4)
MyButton23 = Button(quiz, text="Multiple Choice Question", width=20, command = multiple_choice)
MyButton23.grid(row=9, column=2)
#MyButton24 = Button(quiz, text="Matching Question", width=20, command = matching)
#MyButton24.grid(row=9, column=4)
MyButton25 = Button(quiz, text="Ordering Question", width=20, command =order)
MyButton25.grid(row=10, column=2)
MyButton26 = Button(quiz, text="Fill in the Blank Question", width=20, command = fill_blank)
MyButton26.grid(row=10, column=4)
MyButton3 = Button(quiz, text="Finsh Quiz", width=10, command = quiz)
MyButton3.grid(row=12, column=3)
quiz = Tk()
w = 700
h = 300
ws = quiz.winfo_screenwidth()
hs = quiz.winfo_screenheight()
x = 0
y = 0
quiz.geometry('%dx%d+%d+%d' % (w, h, x, y))
quiz.title("eCampus Quiz Developer")
L1 = Label(quiz, text="Quiz Title?")
L1.grid(row=0, column=0)
E1 = Entry(quiz, bd = 5)
E1.grid(row=0, column=3)
name_file = E1.get()
name_file = name_file.replace(" ", "")
name_file = name_file + ".txt"
with open(name_file,"w") as data:
MyButton1 = Button(quiz, text="Submit", width=10, command = button)
MyButton1.grid(row=1, column=3)
quiz.mainloop()
I am trying to create the dictionary using this chunk of code:
i = 0
let = 'A'
while i < number:
letter = Label(top, text = let)
letter.grid(row = 8+(i*4), column = 3)
answer = Text(top, borderwidth = 5, width=50, height=3, wrap=WORD, background = 'grey')
answer.grid(row = 8+(i*4), column = 4)
answerList[let] = answer.get("1.0",END)
i = i+1
let = chr(ord(let) + 1)
I have even tried putting a loop in the preview function but that is when the last box was the only value contained in the dictionary. Any ideas would be appreciated
Please see my commeneted snippet below which demonstrates this:
from tkinter import *
class App:
def __init__(self, root):
self.root = root
self.entry = Entry(self.root) #entry to input number of entries later
self.button = Button(self.root, text="ok", command=self.command) #calls command to draw the entry boxes
self.frame = Frame(self.root)
self.entry.pack()
self.button.pack()
self.frame.pack()
def command(self):
self.frame.destroy() #destroys frame and contents
self.frame = Frame(self.root) #recreates frame
self.text = [] #empty array to store entry boxes
for i in range(int(self.entry.get())):
self.text.append(Entry(self.frame, text="Question "+str(i))) #creates entry boxes
self.text[i].pack()
self.done = Button(self.frame, text="Done", command=self.dict) #button to call dictionary entry and print
self.done.pack()
self.frame.pack()
def dict(self):
self.dict = {}
for i in range(len(self.text)):
self.dict.update({self.text[i].cget("text"): self.text[i].get()})
#the above line adds a new dict entry with the text value of the respective entry as the key and the value of the entry as the value
print(self.dict) #prints the dict
root = Tk()
App(root)
root.mainloop()
The above asks the user how many entry widgets they want to create, fills a frame with those entry widgets and then iterates through the list which contains them on the press of a button, adding a new dictionary entry for each entry widget, where the key of the dict is the attribute text for each entry and the value of the dict is the value of each entry.