0

This is my current code and it displays in a window but literally prints it the way I've typed it (obviously). But is there a way to write these so they are displayed as powers/exponents? "

questionNum = 0

#SET QUESTIONS HERE

questions = [0,"Given that y = x^4 + 6x^1/2, find dy/dx","Write down the value of 125^1/3","Fully factorise 9x^2 - 25","Find the value of 8^5/3"]

answer1 = [0,"4x^4 + 3x^1/2","25","(3x-5)(3x+5)","1/2"]

answer2 = [0,"4x^3 + 6x^1/2","1/5","(3x+5)(3x+5)","Answer 2 (4)"]

answer3 = [0,"4x^3 + 6x^-1/2","5","(3x-5)(3x-5)","Answer 3 (4)"]

answer4 = [0,"4x^3 + 1/2x^-3/2","125","(9x+5)(x-5)","Answer 4 (4)"]

This is what it looks like:

this is what it looks like

rightanswers = [0,1,2,3,4]  #These are the correct answers
"

This is the bit that needs to be changed. I've added the rest just in case you need any of it to see what's going on:

from tkinter import *   #The TKinter module imported in order to create the menus
import sys  #Invoke functions and statements - allows operations to work and searches for named modules i.e. TKinter
global questionNum  #Connections between functinos and arrays

questionNum = 0
#SET QUESTIONS HERE
questions = [0,"Given that y = x^4 + 6x^1/2, find dy/dx","Write down the value of 125^1/3","Fully factorise 9x^2 - 25","Find the value of 8^5/3"]  #This is the question bank which has been set up as an array
answer1 = [0,"4x^4 + 3x^1/2","25","(3x-5)(3x+5)","1/2"]   #These are the possible answers - this is where multiple choice answers would go
answer2 = [0,"4x^3 + 6x^1/2","1/5","(3x+5)(3x+5)","Answer 2 (4)"]
answer3 = [0,"4x^3 + 6x^-1/2","5","(3x-5)(3x-5)","Answer 3 (4)"]
answer4 = [0,"4x^3 + 1/2x^-3/2","125","(9x+5)(x-5)","Answer 4 (4)"]
rightanswers = [0,1,2,3,4]  #These are the correct answers

normal = Tk()   #Build the TKinter 
normal.geometry("850x350")  #Set the size of the normal chess form to 850x350
normal.title("Normal Chess")    #Sets a title for the normal chess form
normal.columnconfigure(1,minsize = 300) #This is whereabouts the question and answers are displayed
questionVar = StringVar()   #Question will be a string
answerVar = IntVar()    #Answers will be numbers
answerVar.set(1)    #Questions can only have one solution
aText = StringVar() #Text for the answers - options
bText = StringVar()
cText = StringVar()
dText = StringVar()
qNoText = StringVar()   #Questions text which is displayed to the user
questionText = StringVar()
normal.withdraw()   #Allows the user to only select one option

title = Tk()    #Builds the TKinter
title.title("Chess")    #Title of the form
title.geometry("300x300")   #The size of the image
watermark = PhotoImage(file = "watermark.gif")  #Link to the image itself
Label(image = watermark).place(x=0,y=0,relwidth=1,relheight=1)  #Places the image onto the form set on the x,y coordinates
title.withdraw()



menu = Tk() #Builds the TKinter
menu.title("Main Menu") #Displays 'Main Menu' on screen
menu.geometry("400x350")    #Size of the form
p1var = StringVar() #Sets a variable for Player 1 and Player 2
p2var = StringVar()


def Quit(): #Quit function - allows the user to exit the program
    menu.destroy()
    title.destroy()
    normal.destroy()
    sys.exit()  #Gets rid of all the modules

def play():
    title.deiconify()
    Label(title,text = "Enter Details:",font = ("Calibri",25)).grid(row = 1, column = 1)
    #'Enter Details' font, size and location on the form
    Label(title,text = "CHESS",font = ("Calibri",50)).grid(row = 0,column = 1)
    #'CHESS' font, size and location on the form
    Label(title, text = "Player 1: ").grid(row = 2,column = 0)
    #'Player 1' font, size and location on the form
    Entry(title,textvariable = p1var,width = 30).grid(row = 2,column = 1)
    #Allows the user to input a string for the player 1 name
    Label(title, text = "Player 2: ").grid(row = 3,column = 0)
    #'Player 2' font, size and location on the form
    Entry(title,textvariable = p2var,width = 30).grid(row = 3,column = 1)
    #Allows the user to input a string for the player 2 name
    Label(title,text = "Select Game Mode: ").grid(row  = 4,column = 1)
    #'Select Game Mode: ' font, size and location on the form
    Button(title,command = lambda: playNormalChess(p1var.get(),p2var.get()),text = "Normal Chess").grid(row = 6,column = 1,sticky = W)
    #Button for normal chess
    Button(title,command = lambda: playSpeedChess(p1var.get(),p2var.get()),text = "Speed Chess").grid(row = 6,column = 1,sticky = E)
    #Button for speed chess
    Button(title,command = instructions,text = "Instructions").grid(row = 7,column = 1,pady =10)
    #Button for instructions

def playNormalChess(p1,p2):
    normal.deiconify()
    t = Label(textvariable = qNoText,font = ("Arial",50)).grid(row = 0,column = 1,sticky = W,columnspan=2,padx = 20,pady =10)
    #Functions for selection
    q =Label(textvariable = questionVar,font = ("Arial",30)).grid(row = 1,column = 1,sticky = W,columnspan=2,padx = 20,pady =10)
    #Font and size the questions are set in
    a=Radiobutton(variable = answerVar,value = 1,textvariable = aText,font = ("Arial",18)).grid(row = 3,column = 1,pady =5,padx = 20,sticky = W)
    #These are the radio buttons which are linked to the answers - set the font and the size of the text
    b=Radiobutton(variable = answerVar,value = 2,textvariable = bText,font = ("Arial",18)).grid(row = 4,column = 1,padx = 20,sticky = W)
    c=Radiobutton(variable = answerVar,value = 3,textvariable = cText,font = ("Arial",18)).grid(row =5,column = 1,pady = 5,padx = 20,sticky = W)  
    d=Radiobutton(variable = answerVar,value=4,textvariable = dText,font = ("Arial",18)).grid(row = 6,column = 1,padx = 20,sticky = W)
    Button(text = "Submit",command = confirm).grid(row =0,column = 3,sticky = W,pady = 10)  #Submit button to confirm their answers
    newQuestion()   #Calls the function for a new question

def confirm():
    if messagebox.askyesno('Confirm','Are You Sure?'):  #This is the conformation of the correct answer for the user
        try:
            if answerVar.get() == rightanswers[questionNum]:    #If they select yes to confirm they are happy with the selection
            # - it checks their answer with the correct answer and prints 'Right' or 'Wrong' depending on their answer
                print("Right")
            else:
                print("Wrong")

            newQuestion()   #Once their question is answered, a new question will be presented to them
        except IndexError:
            print("No more Questions")


def newQuestion():
    global questionNum
    questionNum = questionNum + 1

    try:
        qNoText.set("Question "+str(questionNum))
        aText.set(answer1[questionNum])
        bText.set(answer2[questionNum])
        cText.set(answer3[questionNum])
        dText.set(answer4[questionNum])
        questionVar.set(questions[questionNum])
    except IndexError:
        print("No more questions")


Label(menu,text = "AS Maths Chess",font = ("Arial",37)).pack(pady = 20)
Button(menu,text = "Play",background = "black",foreground = "white",font = ("Arial",20),command = play).pack(ipadx = 80,ipady = 20, pady = 10)
Button(menu,text = "Quit",font = ("Arial",20),command = Quit).pack(ipadx = 80,ipady = 20, pady = 10)
Brian Tompsett - 汤莱恩
  • 5,753
  • 72
  • 57
  • 129
Inderbir
  • 19
  • 5
  • 1
    relevant: http://stackoverflow.com/questions/13875507/convert-numeric-strings-to-superscript/13875688#13875688 – Gerrat Apr 03 '16 at 15:14
  • This was asked 9 years ago: http://stackoverflow.com/questions/17768347/representing-an-equation-as-a-canvas-object-in-tkinter My suggestion: forget about Tkinter and use Gtk, wxWidgets, or Qt – saeedgnu Apr 03 '16 at 15:36
  • 1
    @saeedgnu: why forget about tkinter? Tkinter is a fantastic toolkit, especially for learning how to do GUI programming. – Bryan Oakley Apr 03 '16 at 16:14
  • For leaning it's fine. But it's based on old TCL/Tk language, it doesn't have too many widget libraries (like TeX rendering widget in this case) and nobody uses it nowadays for desktop. It's only good for very small GUIs which are supposed to be portable. – saeedgnu Apr 03 '16 at 16:18
  • This might help you (using SymPy): http://stackoverflow.com/questions/8651361/how-do-you-print-superscript-in-python – Zac S Apr 03 '16 at 15:38
  • Unicode codes for exponential fractions?? i tried using the one provided by wiki but it just prints out 'U+00B9' rather than the fraction. The other ones work though. – Inderbir Apr 04 '16 at 13:37

1 Answers1

1

Unicode has superscript numerals, arithmetic operators, and some letters in the BMP, which is supported by tcl/tk. See Wikipedia. Within those constraints, and given a supporting font, the answer is yes. On Windows, running from IDLE, the following works nicely and looks nice, though I would want the tk font larger to see the superscript easily with my eyes.

import tkinter as tk
root = tk.Tk()
# "4x^4 + 3x^1/2"
t1 = "4x\u2074 + 3x\u207b\u00b2"  # \u excapes, if needed
t2 = "4x⁴ + 3x⁻²"
label = tk.Label(root, text=t2)
label.pack()
Terry Jan Reedy
  • 18,414
  • 3
  • 40
  • 52
  • Unicode codes for exponential fractions?? i tried using the one provided by wiki but it just prints out 'U+00B9' rather than the fraction. The other ones work though. – Inderbir Apr 04 '16 at 13:37
  • `U+####` or `U+########` are the Unicode standard's notation for Unicode code points. `\u####` and `\U########` are Python's string escape notation, based on fairly common backslash notations like `\n` and `\x##`. – Terry Jan Reedy Apr 05 '16 at 05:17