【问题标题】:Is there a way to write superscripts in python in a GUI?有没有办法在 GUI 中用 python 编写上标?
【发布时间】:2016-04-03 15:10:31
【问题描述】:

这是我当前的代码,它显示在一个窗口中,但按我输入的方式(显然)打印出来。但是有没有办法写这些,所以它们显示为幂/指数? "

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

这就是它的样子:

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

这是需要更改的部分。我已经添加了其余部分,以防您需要查看发生了什么:

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)

【问题讨论】:

  • 这是 9 年前问的:stackoverflow.com/questions/17768347/… 我的建议:忘记 Tkinter 并使用 Gtk、wxWidgets 或 Qt
  • 这可能会帮助你(使用 SymPy):stackoverflow.com/questions/8651361/…
  • @saeedgnu:为什么忘记 tkinter? Tkinter 是一个很棒的工具包,特别是用于学习如何进行 GUI 编程。
  • 倾斜没问题。但它基于旧的 TCL/Tk 语言,没有太多的小部件库(如本例中的 TeX 渲染小部件),现在没有人将它用于桌面。它只适用于应该是可移植的非常小的 GUI。

标签: python user-interface tkinter


【解决方案1】:

Unicode 在 BMP 中有上标数字、算术运算符和一些字母,tcl/tk 支持。见Wikipedia。在这些限制内,并给出支持字体,答案是肯定的。在 Windows 上,从 IDLE 运行,以下内容运行良好且看起来不错,但我希望 tk 字体更大,以便用我的眼睛轻松查看上标。

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

【讨论】:

  • 指数分数的Unicode代码??我尝试使用 wiki 提供的那个,但它只打印出“U+00B9”而不是分数。其他的虽然有效。
  • U+####U+######## 是 Unicode 标准的 Unicode 代码点表示法。 \u####\U######## 是 Python 的字符串转义符号,基于相当常见的反斜杠符号,例如 \n\x##
猜你喜欢
  • 1970-01-01
  • 2021-03-16
  • 2019-09-20
  • 2012-09-14
  • 1970-01-01
  • 1970-01-01
  • 2019-08-23
  • 2018-08-09
  • 2021-03-16
相关资源
最近更新 更多