【问题标题】:if a user enters a fraction as one of the values of the matrix that it will simply convert to float [closed]如果用户输入一个分数作为矩阵的值之一,它将简单地转换为浮点数[关闭]
【发布时间】:2021-09-06 01:12:32
【问题描述】:

我想填写一个矩阵,同时如果输入例如“1/7”,它会转换为浮点数?但它不起作用

import fractions
import tkinter as tk
from tkinter import *
import numpy as np
import pandas as pd
from fractions import Fraction
from tkinter.font import Font
from PIL import Image, ImageTk
from PyQt5 import QtCore, QtGui, QtWidgets

import sqlite3
import tkinter.messagebox
import os
import sys

#此函数包含一个小窗口,您需要在其中输入标准的数量,这将是矩阵的维度,当我填充矩阵并单击提交以将其保存时,它不起作用 定义是(): 窗口 = Tk()

    window.title("Dimensions ")
    window.geometry("300x200")

    def variable():
        global fn, f
        fn = entry_1.get()
        f = entry_2.get()

    ln = StringVar()
    df = []

    name = StringVar()

    def save():
        for entries in range(len(df)):
            df[entries] = name.get()

    for entries in range(len(df)):
        df = df.append({'Critere': df[entries].get()}, ignore_index=True)
    print(df)
    df

    def open_window():
        root = tk.Tk()
        root.geometry("460x600")
        root.title('AHP Application ')
        # global f
        # f=printent()
        # print(f)
        for i in range(int(f)):
            # c = input("Enter valeur {}: ".format(i))

            my_label = Label(root, text="Entrer le critere numero 0{} :".format(i + 1), width=24, font=("bold", 10))
            my_label.grid(row=i, column=0, pady=20, padx=5)

            my_entry = Entry(root)
            my_entry.grid(row=i, column=1, pady=20, padx=5)
            df.append(my_entry)

        suivant1 = tk.Button(root, text="Suivant", width=8, borderwidth=3, command=hope).place(x=370, y=40)
  
        fermer2 = tk.Button(root, text="Fermer", width=8, borderwidth=3).place(x=370, y=90)
        root.mainloop()

    label_1 = Label(window, text="Entrer L'Objectif de Votre projet :", width=24, font=("bold", 10))
    label_1.place(x=3, y=0)

    entry_1 = Entry(window)

    entry_1.place(x=100, y=30)

    label_2 = Label(window, text="Entrer le nombre de critère :", width=20, font=("bold", 10))
    label_2.place(x=3, y=70)

    entry_2 = Entry(window)

    # Remove default 0
    entry_2.delete(0, END)
    entry_2.place(x=100, y=100)

    suivant = tk.Button(window, text="suivant", borderwidth=3, command=lambda: [variable(), open_window()]).place(x=40,
                                                                                                                  y=150)

    fermer = tk.Button(window, text="fermer", borderwidth=3).place(x=190, y=150)

    def hope():
        win = Tk()
        win.title("Matrix")
        win.geometry("700x500")
        global f

        print(f)

        wrapper1 = LabelFrame(win, text="Enter matrix")

        wrapper3 = LabelFrame(win, text="Resultats")

        wrapper1.pack(fill="both", expand="yes", padx=50, pady=20)

        wrapper3.pack(fill="both", expand="yes", padx=20, pady=10)

        def convert_to_float(frac_str):
            try:
                return float(frac_str)
            except ValueError:
                num, denom = frac_str.split('/')
                try:
                    leading, num = num.split(' ')
                    whole = float(leading)
                except ValueError:
                    whole = 0
                frac = float(num) / float(denom)
                return whole - frac if whole < 0 else whole + frac

   # empty arrays for your Entrys and StringVars
        text_var = []
        entries = []
        matrix = []

        # callback function to get your StringVars
        def get_mat():
            for i in range(rows):
                matrix.append([])
                for j in range(cols):
                    matrix[i].append(convert_to_float (text_var[i][j].get()))
            print(matrix)
            b = np.array(matrix, dtype=float, order='C')
            print(b)

            global df2, df, c
            index = []
            columns = []
            for i in range(int(f)):
                index.append("critère{}".format(i + 1))
                columns.append("critère{}".format(i + 1))
            df = pd.DataFrame(data=b, index=index, columns=columns)
            print(df)
            arr = df.to_numpy()
            global c
            c = []
            for i in range(len(df)):
                c.append(np.prod(arr[i].astype(float)))

            df2 = pd.DataFrame(data=c, index=range(int(f)), columns=["hi"])
            print(df2)

        # Label(win, text="Enter matrix :", font=('arial', 10, 'bold'),
        #     bg="bisque2").place(x=20, y=20)

        x2 = 0
        y2 = 0

        rows = int(f)
        cols = int(f)
        global df2, df, c
        x = np.array(['1.1', '2.2', '3.3'])

        for i in range(rows):
    # append an empty list to your two arrays
    # so you can append to those later
            text_var.append([])
            entries.append([])
            for j in range(cols):
                # append your StringVar and Entry
                text_var[i].append(StringVar())
                entries[i].append(Entry(win, textvariable=text_var[i][j], width=5))
                entries[i][j].place(x=80 + x2, y=30 + y2)
                x2 += 40

            y2 += 30
            x2 = 0

        button = Button(wrapper1, text="Submit", bg='bisque3', width=15, command=get_mat)
        button.place(x=300, y=80)


        my_label = Label(wrapper3, text="Lamda Max:", width=24, font=("bold", 10))
        my_label.grid(row=0, column=0, pady=20, padx=5)
        my_entry = Entry(wrapper3)
        my_entry.grid(row=0, column=1, pady=20, padx=5)
        # my_entry.insert(0,lamba)
        my_label1 = Label(wrapper3, text="Indice de Coherence (CI):", width=24, font=("bold", 10))
        my_label1.grid(row=1, column=0, pady=20, padx=5)

        my_entry1 = Entry(wrapper3)
        my_entry1.grid(row=1, column=1, pady=20, padx=5)

        my_label2 = Label(wrapper3, text="Indice de Racio (IC):", width=24, font=("bold", 10))
        my_label2.grid(row=2, column=0, pady=20, padx=5)

        my_entry2 = Entry(wrapper3)
        my_entry2.grid(row=2, column=1, pady=20, padx=5)

        def calcule():
            global f

            df3 = pd.DataFrame(data=c, index=range(int(f)))

            df3 = pow(df2, 1 / int(f))
            print("df3 is ")
            print(df3)

            # Somme
            Somme = df3.sum()
            print("la somme est ")
            print(Somme)

            # weights
            B = df3 / Somme
            print(" La matrice des Poids:")
            print(B)

            # verify if somme of B is 1 , if it is then we are on the right road
            Somm = B.sum()
            print(Somm)

            # consistency check
            print("A3")
            C = np.dot(df, B)
            print(C)

            # consistency check
            print("A4")
            D = C / B
            print(D)
            # global lamba
            # Consistency Index
            # lambda
            lamba = np.mean(D)
            print("the average is ")
            print(lamba.to_string())
            my_entry.insert(0, lamba.to_string(index=False))

            # n = float(n)
            CI = (lamba - float(f)) / (float(f) - 1)
            print("The consistency Index  is")
            print(CI.to_string())
            my_entry1.insert(0, CI.to_string(index=False))
            # consistency ratio

            if int(f) == 3:
                RI = 0.52
            elif int(f) == 4:
                RI = 0.89
            elif int(f) == 5:
                RI = 1.11
            elif int(f) == 6:
                RI = 1.25
            elif int(f) == 7:
                RI = 1.35
            elif int(f) == 8:
                RI = 1.4
            elif int(f) == 9:
                RI = 1.45
            elif int(f) == 10:
                RI = 1.49
            print("THE RATIO IS :")
            print(RI)
            CR = float(CI / RI)
            my_entry2.insert(0, CR)
            if CR < 0.1:
                print("Congratulations ,Your criterias are consistent to go ahead \nThe value of consistency ratio is ",
                      CR,
                      "which is less han 0.1 ")
            else:
                print("you need to re-fill the matrix", CR)

        button = Button(wrapper3, text="calcule", bg='bisque3', width=15, command=calcule)
        button.place(x=500, y=100)
        a = IntVar()

        win.mainloop()
    window.mainloop()


be()

【问题讨论】:

  • 什么不起作用?您可以添加您尝试过的代码吗?
  • 如果你只是在函数中输入1/7 或使用return 1/7,它会起作用。
  • 我添加了代码,它是一个矩阵,你可以用不同的数字填充,但是分数数字不起作用

标签: python tkinter


【解决方案1】:

Python 实际上为此有一个内置模块,它还支持任意精度算术和转换为原生浮点数。

>>> from fractions import Fraction
>>> frac = Fraction("1/7")
>>> float(fract)
0.14285714285714285

易于使用,开箱即用。您还可以将其转换为整数比率,以防您想要比原生浮点数提供的精度更高:

>>> frac.as_integer_ratio()
(1, 7)

float("1/7") 不起作用的原因是它不是实际浮点数的有效表示:它是一个整数比率。然而,分数可以提供与浮点数之间的本机转换。

【讨论】:

  • 我试过 Fraction 但它不起作用,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-27
  • 2021-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-14
  • 2016-01-29
相关资源
最近更新 更多