12 svar
104 visningar
ilsi 59
Postad: 13 apr 2023 15:17

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.

Fermatrix 7841 – Fd. Medlem
Postad: 13 apr 2023 16:36

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.

ilsi 59
Postad: 13 apr 2023 16:48

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.

Fermatrix 7841 – Fd. Medlem
Postad: 13 apr 2023 19:26 Redigerad: 13 apr 2023 19:28

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.

Laguna Online 28602
Postad: 13 apr 2023 19:32

Hur många siffror kan det röra sig om?

ilsi 59
Postad: 13 apr 2023 19:55

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 

Hondel 1294
Postad: 13 apr 2023 20:02

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?

ilsi 59
Postad: 13 apr 2023 20:04

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

Hondel 1294
Postad: 13 apr 2023 20:13 Redigerad: 13 apr 2023 20:14

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å?

Laguna Online 28602
Postad: 13 apr 2023 20:19

Ska programmet säga ungefär "du hade rätt fram till sjuttonde decimalen", eller något mer avancerat?

Fermatrix 7841 – Fd. Medlem
Postad: 13 apr 2023 20:22

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.

ilsi 59
Postad: 13 apr 2023 21:04 Redigerad: 13 apr 2023 21:05

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")

ilsi 59
Postad: 14 apr 2023 11:38

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

Svara Avbryt
Close