Hur får man, i python, programmet att kontrollera det som skrivs i "entry" mot importerat bibliotek?
Vi ska i kursen programmering 1 göra ett program i pyhton där användaren har möjlighet att testa sina kunskaper om pi. Som användare ska man då kunna skriva in de siffror man kommer ihåg och att programmet sedan avgör om dessa är rätt eller inte genom att kontrollera mot de exakta siffrorna av pi. Jag har valt att använda tkinter och är egentligen klar med självaste uppsättningen. Problemet jag nu inte kommer vidare från är hur man just kan få programmet att kontrollera det som skrivs in gentemot vad som är rätt. Jag har lyckats göra detta i terminalen men vill som sagt använda GUI och tkinter. Skulle uppskatta om någon kunde hjälp mig på vägen.
Att beskriva hella Tkinter är rätt mycket jobb, kika då istället på en youtube video.
Jag föredrar annars PyQT5 för att göra guis, du kan då designa ditt GUI snabbt i en liten designer och konvertera det till kod. Sedan är det bara att skriva logiken bakom menyn.
tkinter är inte problemet utan det förstår jag och har som sagt ett färdigt program med GUI där man kan skriva in siffror osv men problemet är att jag inte lyckas få det som skrivs in att kontrolleras mot pi. Har försökt söka men av det som kommer upp är det inget som är relevant alt inget som fungerar för det som redan är gjort.
Det är svårt att säga då vi inte har något att referera till.
Textrutan som användaren ange sina tal i etc är ju ett objekt i sig. Detta objektet kan man läsa värdet ifrån (värdet i rutan), vilket är en sträng. Om användaren endast anger siffror (går enkelt att lösa) så kan du casta till en integer. Sedan kan du checka hur många siffror som stämmer överens. Eftersom det är prog 1 så är tanken nog att iterera med enumerate och jämföra varje index för sig eller liknande.
Hur många siffror kan det röra sig om?
Förstår inte riktigt vad du menar men ska jag bifoga det jag gjort hittills?
Kan vara upp till 50 men min tanke är att användaren ska välja (10, 20, 30, 40 eller 50), programmeringen är ju dock samma så ska inte spela nån roll så länge definitionen läggs inom den andra
Vad är din fråga, vilket steg är det du inte vet hur du ska göra? Vet du hur man får användaren att mata in något och spara i en variabel? Eller är det att du inte vet hur du kan jämföra decimalerna i den sparade variabeln med decimalerna i pi?
Hur man lägger in är inga problem så jag har en ”entry box” där man kan skriva in siffror genom att trycka på en ansats men vad jag inte lyckas med är att få det som skrivs in att då jämföras med de i pi
Ok, så du kan få in användarens svar i en variabel? Så i princip behöver du då skriva en funktion
def compare_decimals(user_input):
# jämför user_input med pi
Du kan ju fundera på hur du kan ta dig an detta, du kommer behöva manipulera user_input litegrann. Men låt säga att du klarat av att bearbeta user_input så att du fått alla decimalerna i en lista, där varje element i listan är en decimal. Och så har du massa decimaler i pi i en annan lista. Skulle du kunna lösa det då?
Ska programmet säga ungefär "du hade rätt fram till sjuttonde decimalen", eller något mer avancerat?
Som du ser är det extremt oklart vad det är du vill ha hjälp med. Ladda upp all din kod i framtiden och redovisa mer tydligt vad exakt det är du inte får till.
Här är ett exempel där det skrivs ut "This is pi" om man skriver in 3.14 och sedan trycker på submit.
import tkinter as tk
class Application(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.master = master
self.pack()
self.create_widgets()
def create_widgets(self):
self.input_box = tk.Entry(self)
self.input_box.pack()
self.display_label = tk.Label(self)
self.display_label.pack()
self.submit_button = tk.Button(self, text="Submit", command=self.check_input)
self.submit_button.pack()
def check_input(self):
user_input = self.input_box.get()
if user_input == "3.14":
self.display_label.config(text="This is pi")
else:
self.display_label.config(text="")
root = tk.Tk()
app = Application(master=root)
app.mainloop()
Har du fortfarande problem eller funderingar, börja med att posta din source code mha {:} verktyget (som jag gjorde ovan) och besvara gärna de andra frågorna som ställs i tråden.
Hondel- det är ungefär så långt jag kommit men har inte lyckats få till vad som faktiskt ska definieras
Laguna, det är ett alternativ om det är lättare, annars var tanken mer att den efter varje inlagd siffrar kollar och antingen "display" den om det stämmer och annars ger ett felmeddelande
Dracaena- det är inte riktigt så jag menar men möjligtvis att det är något jag kan använda, tack!
Bifogar även koden nedan:
from tkinter import *
from tkinter import messagebox
import sympy as sp
import math
root = Tk()
root.geometry("350x200")
root.title("Let's learn pi!")
root.configure(bg="#ebf7ed")
label = Label(root, text="M e m o r i z i n g 𝝅!", font=("optima", 15, "bold"), bg="#ebf7ed")
label.grid(row=2, column=0, columnspan=3)
label = Label(root, text="", bg="#ebf7ed")
label.grid(row=1, column=2)
label = Label(root, text="", bg="#ebf7ed")
label.grid(row=3, column=2)
label = Label(root, text="", bg="#ebf7ed")
label.grid(row=5, column=2)
def show():
label.config(text=clicked.get())
options = ["10", "20", "30", "40", "50"]
clicked = StringVar()
clicked.set("Choose")
def openNewWindow(event):
newWindow = Toplevel(root)
newWindow.geometry("700x500")
newWindow.config(bg="#ebf7ed")
entry = Entry(newWindow, font=("optima", 12), bd=3, width=30)
entry.grid (row=3, column=0, columnspan=5)
emptylabel = Label(newWindow, text="", bg="#ebf7ed")
emptylabel.grid(row=1, column=0)
emptylabel = Label(newWindow, text="", bg="#ebf7ed")
emptylabel.grid(row=4, column=0)
def digit(value):
ex = entry.get()
answer = ""
try:
global m1
m1=("You lost! \n Do you want to try again?")
if value == "Delete":
ex = ex[0:len(ex) -1]
entry.delete(0, END)
entry.insert(0, ex)
return
else:
#messagebox.askretrycancel("Title", m1)
entry.insert(END, value)
return
entry.delete(0, END)
entry.insert(0, answer)
except SyntaxError:
pass
def findNumbers(t):
l = []
for num in t:
try:
l.append(int(num))
except ValueError:
pass
return l
button_text_list = ["1", "2", "3",
"4", "5", "6",
"7", "8", "9",
"0", ".", "Delete"]
rowvalue = 5
columnvalue = 0
for i in button_text_list:
button = Button(newWindow,
width=5,
height=2,
bd=2,
relief=SUNKEN,
text=i,
bg="#E5E9F0",
fg="#17202a",
font=("Times new roman", 14),
activebackground="#D08770",
command=lambda button=i: digit(button))
button.grid(row=rowvalue, column=columnvalue, pady=1)
columnvalue += 1
if columnvalue > 2:
rowvalue += 1
columnvalue = 0
#def correct(user_input):
#try:
#int(entry.get(digitsOfPi))
#except ValueError:
#messagebox.askretrycancel("Title", m1)
def quit():
root.destroy()
quit_button = Button(newWindow, text="Quit", bg="#ebf7ed", font=("optima", 12), command=quit)
quit_button.config(width=5)
quit_button.grid(row=9, column=0, columnspan=3)
def go_back():
newWindow.destroy()
go_back_button = Button(newWindow, text="Back", bg="#ebf7ed", font=("optima", 12), command=go_back)
go_back_button.config(width=5)
go_back_button.grid(row=9, column=2, columnspan=3)
if clicked.get() == "10":
newWindow.title("10 digits of pi")
Label(newWindow, text ="Let's learn 10 digits of pi!", font=("Optima", 11), bg="#ebf7ed").grid(row=2, column=0, columnspan=2)
elif clicked.get() =="20":
newWindow.title("20 digits of pi")
Label(newWindow, text ="Let's learn 20 digits of pi!", font=("Optima", 11), bg="#ebf7ed").grid(row=2, column=0, columnspan=2)
elif clicked.get() =="30":
newWindow.title("30 digits of pi")
Label(newWindow, text ="Let's learn 30 digits of pi!", font=("Optima", 11), bg="#ebf7ed").grid(row=2, column=0, columnspan=2)
elif clicked.get() == "40":
newWindow.title("40 digits of pi")
Label(newWindow, text ="Let's learn 40 digits of pi!", font=("Optima", 11), bg="#ebf7ed").grid(row=2, column=0, columnspan=2)
else:
newWindow.title("50 digits of pi")
Label(newWindow, text ="Let's learn 50 digits of pi!", font=("Optima", 11), bg="#ebf7ed").grid(row=2, column=0, columnspan=2)
title = Label(root, text="How many digits of pi do you want to learn?", font=("optima", 11), bg="#ebf7ed")
title.grid(row=4, column=0, columnspan=2)
drop = OptionMenu(root, clicked, *options, command = openNewWindow)
drop.config(font=("Times new roman", 12))
drop.grid(row=4, column=2)
def quit():
root.destroy()
quit_button = Button(root, text="Quit", bg="#ebf7ed", font=("optima", 12), command=quit)
quit_button.config(width=20)
quit_button.grid(row=10, column=0)
mainloop()
Även då det fungerar, men endast i terminalen:
import sympy as sp
import IPython.display as ipd # ONLY for python notebooks like colab
digitsOfPi = str(sp.N(sp.pi,4))[2:]
piLength = len(digitsOfPi)
output = []
digits = ""
counter = 0
k = 0
print(piLength)
while k < piLength:
print(f"3.{digits}\nScore:{counter}")
userInput = input("Enter the next digit: ")
ipd.clear_output(wait=3) import IPython.display as ipd # ONLY for python notebooks like colab
if userInput == digitsOfPi[k]:
output.append(digitsOfPi[k])
digits = "".join(output)
counter += 1
k += 1
elif userInput != digitsOfPi[k]:
break
else:
print("You Win!")
break
if k == piLength:
print("You Win")
else:
print("you lose")
Har även testat att använda det som fungerar i terminalen men att ta bort "IPython.display" då det bör fungera men misstänker att det då är något jag missar