From b6041f3fc4d44b7696a634b2516350feab3ec2e6 Mon Sep 17 00:00:00 2001 From: sarthaksaitwal Date: Thu, 7 May 2026 12:24:39 +0530 Subject: [PATCH] Added quizzler app project --- Quizzler_App/README.md | 63 +++++++++ Quizzler_App/__pycache__/data.cpython-311.pyc | Bin 0 -> 545 bytes .../question_model.cpython-311.pyc | Bin 0 -> 579 bytes .../__pycache__/quiz_brain.cpython-311.pyc | Bin 0 -> 1785 bytes Quizzler_App/__pycache__/ui.cpython-311.pyc | Bin 0 -> 4565 bytes Quizzler_App/data.py | 129 ++++++++++++++++++ Quizzler_App/images/false.png | Bin 0 -> 2871 bytes Quizzler_App/images/true.png | Bin 0 -> 2565 bytes Quizzler_App/main.py | 21 +++ Quizzler_App/question_model.py | 5 + Quizzler_App/quiz_brain.py | 32 +++++ Quizzler_App/ui.py | 65 +++++++++ 12 files changed, 315 insertions(+) create mode 100644 Quizzler_App/README.md create mode 100644 Quizzler_App/__pycache__/data.cpython-311.pyc create mode 100644 Quizzler_App/__pycache__/question_model.cpython-311.pyc create mode 100644 Quizzler_App/__pycache__/quiz_brain.cpython-311.pyc create mode 100644 Quizzler_App/__pycache__/ui.cpython-311.pyc create mode 100644 Quizzler_App/data.py create mode 100644 Quizzler_App/images/false.png create mode 100644 Quizzler_App/images/true.png create mode 100644 Quizzler_App/main.py create mode 100644 Quizzler_App/question_model.py create mode 100644 Quizzler_App/quiz_brain.py create mode 100644 Quizzler_App/ui.py diff --git a/Quizzler_App/README.md b/Quizzler_App/README.md new file mode 100644 index 0000000..e56d4f6 --- /dev/null +++ b/Quizzler_App/README.md @@ -0,0 +1,63 @@ +# Quizzler App + +A small True/False quiz GUI built with Python. The app fetches questions +from the Open Trivia Database (OpenTDB) and presents them in a simple +Tkinter interface with True/False image buttons and score tracking. + +**Features** +- Fetches 10 boolean (True/False) questions from OpenTDB +- Simple GUI using `tkinter` with image buttons (`images/true.png`, `images/false.png`) +- Score tracking and immediate feedback (green/red) between questions + +**Requirements** +- Python 3.7 or newer +- `requests` package (for fetching questions) +- Internet connection to fetch live questions from OpenTDB +- `tkinter` (normally included with standard Python installs) + +**Install** +1. (Optional) Create and activate a virtual environment: + +```bash +python -m venv venv +# Windows +venv\Scripts\activate +# macOS / Linux +source venv/bin/activate +``` + +2. Install dependencies: + +```bash +pip install requests +``` + +**Run** +- Open a terminal in the project folder (Quizzler_App) and run: + +```bash +python main.py +``` + +Note: Run from the `Quizzler_App` folder so the `images/` paths load correctly. + +**Project files** +- `main.py` — Entry point. Builds question objects, starts the quiz UI. +- `ui.py` — Tkinter-based user interface and mainloop. +- `quiz_brain.py` — Quiz logic: question flow, scoring, and answer checking. +- `question_model.py` — Simple `Question` model (`text` and `answer`). +- `data.py` — Fetches question data from OpenTDB using `requests` (see note below). +- `images/` — Contains `true.png` and `false.png` used as button images. + +**Notes & customization** +- `data.py` currently fetches questions from OpenTDB at runtime. If you + want to run the app offline, replace the request block and use the + static `question_data` list (there is an example commented out in `data.py`). +- If the image buttons do not display, ensure the `images` folder and + files are present and that you run `python main.py` from the project folder. + +**Contributing / Troubleshooting** +- If you see network errors, check your internet connection and API availability. +- Ensure `requests` is installed in the active Python environment. + +Have fun quizzing! 🎉 diff --git a/Quizzler_App/__pycache__/data.cpython-311.pyc b/Quizzler_App/__pycache__/data.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..62242a066418ff1aaf3d7e67830543a6b5cfed95 GIT binary patch literal 545 zcmY+9F>4z!6vvhP- z@}J^=E_A6&y!vt;dIWuhrvFfM-aiz7(cU&=5yf%S(k>pcBv#r{V@@Y)1Esj^wA+l+ zSds144jZ*GAGY{_zcsX-h)BB}3p|qA6I3RVl1*Rxf__Sf{avTW$7;ah-iKs3nM73d zH#zSWOpA|a{>F%rB%*J`3xgwbNilohQ=*4rqIZ|>dE2f!{ehbN2!z5R=;h1uckra I;<>r&4{B|WXaE2J literal 0 HcmV?d00001 diff --git a/Quizzler_App/__pycache__/question_model.cpython-311.pyc b/Quizzler_App/__pycache__/question_model.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d60b694586972b7bfd3571ab733b2a82e8b2b69a GIT binary patch literal 579 zcmZvZze~eV5XbK&vBdrWh2r3#K^L=h6+{FIboSnN#! z_{2|I4=kk%raCMO6j_mEO%!Vo&|?<#6pJmPr^@|_-ibvR*%NoD7P~1Bm-6fa-5Ta> z4jh%Vxq?~A#%b`stZgcZ7KxWAsSMokSp=q*)Ay#) z)5Ps}VtY1oM8NMoukRNV@$tkGPRpAnI_I`)N1V@&%W+#}iD)5RZ~>d<=}LP&+?zw=Xz>%GxhI>CCsACA|K>|YOjxHNsqFd}%swoHO vDeOCWo{qLnCJ{%(*VLqG^=*-VRK3rlCX`^ZasJ_9SlrBxROeoD6;dF z%v$3>4n26#Lk43hltC`bI&#^cVh2HmU}LaTFT*1{^|bfClI57@(68+GeZRi%>Am;) z>eqC7jKKPH_n${U#0dEtg~1X-=JX~o2Sg`2HA#gCV?g7&2sEL`Ax^@-c)wX|ea@;iON)}g zdF0_$$>|yorqec2feRLw2I)u}ZP8hsfP^Rc(g`FH$_&kl=x27ChV9hqmTEP(9~#V$ z+ghC&emc^dHQVtgv?gPQ<){O-BKV?hn2-F#j*1>O#*^hY^S77R8&8~#y0wmFv`mAk zpEVlmJ0PeJv8ZC>i7%;Y&8j)7+PV}KTO8;lh-7~NWRG~Waz}KfY46HZM|?Ks<>yd* z&y(kI&v*In6kLfG6%PVVkhf|Dm;)$(6ZT*^Q6mWIqb41}`Qs?Y7I%h5(XtX_36T7l zX;=(jO`#02W23XoQfSLU2TfDmsM=9~>{fnQ**WHM4Dmh?C^D0EGjqRaFX!D4S9%Mp z?!xLxX0up_XH76!#cub%^Ju+HM3O&-&sk4{@@h%TtnDd)oA6d{{~OEA); z&G^7$v|YPY7tZE?0hgprUyz?gycp%zn4%@zFSdkbSxN9N@}{zjVDQBaXWR6pre)Y# zwPE<8V?1^gfp;08_z)<)& zSQc`8b4L+__9v>A{T*I>vkn_W5CG;8;(oGe!}SgA^+&U@T>J^sU!qQ1{ zsheE#QWKqf&+a|H{{2_Dd)ce|rN6S*_80jG%E|@&pjg#yLsk7TRo$-ZO%wT)3Mi?X zfrSCw2}4k@Ye;5*{6=^L4l9O`=LGM&{WXxi=;@1M{6?QdBt_$EeG-v`7+*wdNG1~T zT%Wv6f@GKn;C*?Jjunu@yUyR^jkFRJu*T*7g{9e*BwzQhAb$Onm?*lfNqED6g;fDl5nf$h?!*|JG#n<9-Izlk&8*kNWu z7B@&#;*bNEl~6%#SMn(h!Uqm}Kt1iH$4WESNRCEALTZsVm&z;l#Hs)PjAvpeq22b> z$Mb*Qd;jnE@p~`)ndch_lncN6=fdAYg!~;lPVrS6Z_h*H31NhJGGrFNT*kA+&2b*W zymMZT{FpG`L&E$U93ju)XO}r23(Sy2a2vY`kLfuEgkE2f@*m4dDVq=Wo<4W>^vJ1H zRo?nI+HX%m_X!cnoQIJ)j(J4y0>`+AKCtS2Nap5Tq|qjmfJ4W zXt=^KVH+OMhM!$LpkJfoOt8bYzN)n#_7H=Vi{1^e{oJ+hAu7M4zb%r?4Ok6>0r4g1^cyZf>#vRR_7US6gc91pI#?6|G zEgJ#I6MlAq$iqAB8k_q^4$IFDvDRYS2F&VncV;2_h+~Bi)?VzWUy=Kq+P%YH;~@Hj zPQQ4#ekLHICWi-dZu>oRd58t~nakQ}I`>55t&7GBUYZ?``$W^?@IcOOzc-qFR(6dP zYSz}VMo9gh-?eL7cjR_jyEPbr!`L-#hVV4zGorkWY6-8&&8JP@a*};v(R=yeOe!af zqbE)O>Y}8IAmLNRFI1CTNXxi;WISTqc!Cm~>6LSDlv7@ z3@nOLdQr6$w||d{_kl=7Po@iy5;~!C4eCR>zl?C1wUDli9mT1=Q?sV@ej2swh~q%ipQa zgWYZT`C?AZUBkG|z{e}9n#-DDj9*xmMMV*r*=Y6VZ5D6E>+-^Ox5{izi>i=?*%cfg zW@rh}HVLpY+~IgUel7rioibNQaSn9JUDc9bx& zynJ&-8d|<*h6F*%N~$2_+mY*{|By3|n4$auw!s6k)fQWCebo7?qw`Dku?o$|7UdsB z%CxIQyPl5fbikkk8Xc&PMoKjD)o)*LFFB1ybb8UC7d3kEP4r0N-iu%UwNZ;s>Cq`8 zI=xgI^-%j(%fPFa?yZ)=3QuAq-;rRf@p~lbB2sB04F@pX&Jyi>nk?LTG4b-0 zMmu#nZqRX!j=zcYYsbg5$R#~;$%tH9kG+b1uo?TN)tLBPi_YlL86!ILpM#AKXdjMi z(aU=DvJt%u_Fr}PYR5*uIb%%zLhHVvci%9&Z=jhjE9b5=iCGjw{yphq-%1V%9U?h@_RY0RK85Vz}FSR#_bgYFbue7yGF{sTtgiYB)l4k^^i zxueWe_0@Gz3Z`5Za-0KKcTk|8|}mEH$d~zZ_0dciSI33G5SVcexmWcIzMUflbTas z?~>8R<}IO=!KXAnRqK3n)bclC@FN;OVsU!Pe1D1W-~5Tj_v`#QgFmM^RlWqt)}3=a zmDV|D(D-5JynfH&i7B|}5sbKHZO;ST+GpIf>6?Y??U~o!4`J9(soO#_tE`H$$)}~e zqOc%}Y(AN~{j9peAxRNrd|lM7F+K9ZFX*8c)4{e3Qv_kX!cm=7#toK`9B`h(bp&9p=d6V%d)MHnAhCN5>NfBw2q-Baum!`d72<6;Rt11qiH{ZFWX5#< zxWOOStXe(z7VoUZOBj4Y;}cbQvYtt23bRH(JcPP*I%d!@&8gO^O(!V6$g;^LQ4q`q zL0HPMl?=AS0^n^jV{>GjD0vJCZW9@gii|r-#+05B%a)C#cx%c?@G?{~KpwdNDqK$> zUbs*p@Yzj%qC z4v67ac=E5Xg#c&8{Vp_Sr#>#v!5D5(1sfHw$K%-|ZJJZJNL;J0uMc!QXsiUzdmy5{ N{r$cl_ul8;bI*Owx%b?2o&r=qB?q9S)oUJ(Geks6pvkcqM2!)U4Gow&)!KQ@9a zdEm^&%AUJVP3B4WjQ+uMG>*Mn1=dMb6pS1o2{j_YcL>LWbvds3fZ5*J#<~d{6 z)UhjJ*pQ;J5O!-Ze#xrYP|^HhPhu2Sowx7>zNnU1l4{ZFh(Nu2qpRbA#|Q;JL+|D^ zdK6P<^RlnB(gr4VJ0U7bu~M-yo*~oAUc?|tA-gO0t_FGf>k#c8CTAb@EyHp$Nx6g{n{Ru)cTNB9zO+MhMlhYQPGI9l^n&?H z%q*t{C}+!N^V*`$#zqZkVPpu+;>IA^}06C2_5T$UD5srJR(Y({QY(u z-@lf?l-^?XdTt0sA8^Y1PoHGc@kQ{qTTefxJ|#re4_ERKqRA$!!RAi3n}&4=yEJg{ z-RPMc4NvrNx-G7m;qSIZ>*O5*>DxlbWmbMC5<)Fqw^gi^O)ieY3%PCM5{=;s5st94)8=6MBi?$unQJ5(nQ)kVt;|Amsh)?D}e=l@FB2lj#; zSFi^XK`X_A@bliSTJkS#*7K$~^_39K$;GDjk5Wfz7@5csj(K#Sdgt(2!aQj@WEJ_z z$=PPUl}%T)h`9aN{T&vv5rj8{E*$_kGH}@AgIai~RQ}j&qou5Ks?Y<9UPm0}9{%iu zJhegZ9Tir=9}aTOsQ}gOhX(uFU;27ZNH<$?NK0`H?t0mwKT3fiywRARDtZwc#?a-r zk{tOS^YR#odPwsNGx;ZXXee9Kq-D{TIq|vnK`xR@V#v`VkOiLH@SI6l{r!>^$s1}a zzm@)NVb$;FJtnBBcj&|Fns>(8x3hpFUA$GY%YD%PI!vy|yy5!wm1Xs17792eU@v8= z7C94s-!vsl&V|w^Q8hgk-++3N6l!dLdT%RxU=nq=+2I5FI6OYIa^tSyyX-7iAPDzK ztNmi!Db1aH~DgwL)EXF1l$ZdOHtTFW_N zsFXA-(tYpBMh|O5MoR&nH%WGxY%FtYcf3}Kt*4{NWiK}U<=mZ55m1f43mU|@j?mnV zN_8hrhD1?Vd3U^@e~_^0x`|a%`pe;eT7dl)6pUW~F-Gzs_vFB2a;9MZB8t zyVckjooH5vbX12=)1NiozZ>^w<4Wt8i9lh643r=M5PBLtW$tAo(SfF;4#|+efhL>i z#yijSshf~>|8f?0s7;cl-1CkvpcH{h8C4&`hBIip5d)`0DF1V0rD z1X@*bPVRhz?{o4|X{8Gf_t+yWhh8R6Pc0PU7s6$kzPZH5!KQ(3-B>nPHRes0(%0)X z4HQ!NJ@C*FeQ_~~@t|F!0d&@tb~z3k%!8~nC`T|T>W5qq^Hg>^MnpDw=Qg1j7O2G+nh!-noymCo9 z${l5dA3r-w?Kr=TgEz!bUeiZiz?>{KSHIAJmKp)1N-f`hBuwEfN>7NzrOUU zLkbwTuXtg3PV+ySN@yq#R*I;7_`R@c9xUb7rmEr0ELfO2!y$|d^75DOyo*Pf9Cta5 zku>&PzsE(aszphT*=@OHE8ra<`#n-ZUc^INhSPDT-=IFz7ZX9=zIbkZS9pBHa>mzy zn1Cbv*un7xZj97K+$@G)yMRyg7GKF~$Gf6j+%;x4Fxb73FindzdH}Jh7nkj#>~sEw z)T?z=YM>39bzQ??ReV5;_0XQWyr!!LIBxw&MZ4jIfPQKAkCOd^r*cx*+LiBO__~uN z!_bEgPqDk@qdT9Ho?&YZU@lBt{r&PIzsOoF@4q+Ioi1T~;}JQlgI6Xo2`pB7CrbJ^ zf{4a&+8)+&lMfP*oE$OvfyLs)lxE*D1wX;_<#+M@Rt#|eJT)y`OW5wHthVBD>cg={ z#-+nt$p`$~6-b4}ZA->Nw&b_sSw;6~U5Z&ttQ}MFy{XsL22mFBE7D((`dZE#;$Y%++KQY&I zjBeXl{j&?XOzC1kg$-f zo&2K*Z^l1VZLqwp3QWHEXwb+nnfp>!o)uhC7FmZwiQS)7t?_z^Zq{9JBYk}cVB$L{c8V=9S8O!;a*I-qze>xfQTme9Eq^?txJW$0$B zzp+hiXE-=VF&pI~^D-R@)2^&Bw1+RWn0XAHM8mE-fb|^1dMiqH4aj9MBaxLzIJ*In zuHkxFMby-Hg{yHe2dkNCn)ZaUmdO6cqJ_`UDfcahbIGLzaCT!)C}Iz6Lia=&>28i- z*8WH_7{Y!nP&czM5+7z3@bFV?d7#Ykdt1I>Edt2+t#IK7@);I zA}ypJ>#ci3UxZzPQmU)TiI4A;dH>M&V&*dxl8vdjrka|_`T4-z1IA1SpT3a&jlXEV z8S7bstlhW^F;mE+{Ua(c3|ucCE#235rB+ZfyTkko>yZkjXBuS+1gJ*aBSeOY0 z8={iFlWiAES@R06s7R}YFbUm4#?mkMcd9q6qR%;QBAdq-vi;5~T1n#eW~D^cLsy%w z$;4(uwA6c_jkx|cW4O-h-1*MnHgmn=rl->JZjt`d56%NKk$|uuj#&nZwdI%nD-qWh z(#K~#(AQ2s3FanM`jt&*`)#GP9$?RV%+zTC!_4+*Zmt#gGiSs7Vg`DErBk{eNi*jq y?%k88d0{ITPmN%|D{jn5pSjRp0I-3nK1%oLtN#Fx$E!&I literal 0 HcmV?d00001 diff --git a/Quizzler_App/images/true.png b/Quizzler_App/images/true.png new file mode 100644 index 0000000000000000000000000000000000000000..79ca9a304fd32c09b0b2cd9bc70e0ef7e39e8011 GIT binary patch literal 2565 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 literal 0 HcmV?d00001 diff --git a/Quizzler_App/main.py b/Quizzler_App/main.py new file mode 100644 index 0000000..b60364c --- /dev/null +++ b/Quizzler_App/main.py @@ -0,0 +1,21 @@ +from question_model import Question +from data import question_data +from quiz_brain import QuizBrain +from ui import QuizInterface + +question_bank = [] +for question in question_data: + question_text = question["question"] + question_answer = question["correct_answer"] + new_question = Question(question_text, question_answer) + question_bank.append(new_question) + + +quiz = QuizBrain(question_bank) +quiz_ui = QuizInterface(quiz) + +# while quiz.still_has_questions(): +# quiz.next_question() + +print("You've completed the quiz") +print(f"Your final score was: {quiz.score}/{quiz.question_number}") diff --git a/Quizzler_App/question_model.py b/Quizzler_App/question_model.py new file mode 100644 index 0000000..b3d63d3 --- /dev/null +++ b/Quizzler_App/question_model.py @@ -0,0 +1,5 @@ +class Question: + + def __init__(self, q_text, q_answer): + self.text = q_text + self.answer = q_answer diff --git a/Quizzler_App/quiz_brain.py b/Quizzler_App/quiz_brain.py new file mode 100644 index 0000000..f3d3a1b --- /dev/null +++ b/Quizzler_App/quiz_brain.py @@ -0,0 +1,32 @@ +import html + + + + +class QuizBrain: + + def __init__(self, q_list): + self.question_number = 0 + self.score = 0 + self.question_list = q_list + self.current_question = None + + def still_has_questions(self): + return self.question_number < len(self.question_list) + + def next_question(self): + self.current_question = self.question_list[self.question_number] + self.question_number += 1 + q_text = html.unescape(self.current_question.text) + return f"Q.{self.question_number}: {q_text}" + # user_answer = input(f"Q.{self.question_number}: {q_text} (True/False): ") + # self.check_answer(user_answer) + + def check_answer(self, user_answer): + correct_answer = self.current_question.answer + if user_answer.lower() == correct_answer.lower(): + self.score += 1 + return True + else: + return False + diff --git a/Quizzler_App/ui.py b/Quizzler_App/ui.py new file mode 100644 index 0000000..0e54b3a --- /dev/null +++ b/Quizzler_App/ui.py @@ -0,0 +1,65 @@ +from tkinter import * +from quiz_brain import QuizBrain + +THEME_COLOR = "#375362" + + +class QuizInterface : + def __init__(self,quiz_brain: QuizBrain): + self.quiz = quiz_brain + self.window = Tk() + self.window.title("Quizzler") + self.window.config(bg=THEME_COLOR,padx=20,pady=20) + + self.score_label = Label(text="Score:0", fg="white",bg=THEME_COLOR) + self.score_label.grid(row=0,column=1) + + self.canvas = Canvas(width=300,height=250,bg="white") + self.question_text = self.canvas.create_text( + 150, + 125, + width=280, + text="Some Question Text", + fill=THEME_COLOR, + font=("Arial",20,"italic") + ) + self.canvas.grid(row=1,column=0,columnspan=2,pady=50) + + true_button_img = PhotoImage(file="images/true.png") + self.true_button = Button(image=true_button_img,command=self.true_pressed) + self.true_button.grid(row=2,column=0) + + false_button_img = PhotoImage(file="images/false.png") + self.false_button = Button(image=false_button_img,command=self.false_pressed) + self.false_button.grid(row=2,column=1) + + self.get_next_question() + + self.window.mainloop() + + def get_next_question(self): + self.canvas.config(bg="white") + if self.quiz.still_has_questions(): + self.score_label.config(text=f"Score:{self.quiz.score}") + q_text = self.quiz.next_question() + self.canvas.itemconfig(self.question_text,text=q_text) + else : + self.canvas.itemconfig(self.question_text,text="You've reached thee end of the quiz.") + self.true_button.config(state="disabled") + self.false_button.config(state="disabled") + def true_pressed(self): + is_right=self.quiz.check_answer("True") + self.give_feedback(is_right) + + def false_pressed(self): + is_right=self.quiz.check_answer("False") + self.give_feedback(is_right) + + def give_feedback(self,is_right): + if is_right: + self.canvas.config(bg="green") + else: + self.canvas.config(bg="red") + self.window.after(1000,func=self.get_next_question) + +