函数不起作用,然后程序由另一个使用runpy的程序运行

2021-09-17 00:09:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经在两个独立的.py文件中创建了两个简单的程序(因为根据我目前有限的知识,我不能在一个脚本中有两个tkinter窗口)。一个程序(我们称之为Mother)有一个按钮来运行另一个(Child)程序,该程序应该执行简单的计数功能。你知道吗

Child程序在我独立运行时按预期工作,但当我从Mother程序调用它时,函数不工作,程序变得不可用。你知道吗

当前(然后从Mother调用)我得到了错误xCost = float(Cost.get().replace(',','.')) ValueError: could not convert string to float:,但是如果我试图修复它,我只会在不同的地方得到错误。你知道吗

另一件事是不工作-DestPPP变量没有得到值,然后从Mother程序打开,但工作正常,然后正常打开。你知道吗

我不知道它是否对我的错误有任何影响,但是我应该提到Child程序使用CSV文件来获取一些数据。CSV文件是简单的三列结构,第一列是国家,第二列是购买力平价指数,第三列是两个值(默认指数和数据年份),所有内容如下所示:

|Austria|0.77|0.45| |Finland|0.55|2018| |Germany|0.84| | |Czech |0.32| |

我做错了什么?我的代码有问题吗?或者我应该以其他方式打开Child?你知道吗

下面是我的程序的最小工作示例(您只需要创建CSV文件):

母亲计划:

   from tkinter import *
from tkinter import ttk
import runpy


root = Tk()
root.title("Mother Window")
root.geometry("260x250")

mainframe = ttk.Frame(root, padding="3")
mainframe.grid(column=0, row=0)
root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)

def ChildRun():
    runpy.run_path("Test_child.py")

Button(mainframe, text="Run child program", command=ChildRun, wraplength=150).grid(column=1, row=1, sticky=(N, W, E, S))


root.mainloop()

儿童计划:

import csv
from tkinter import *
from tkinter import ttk

Countries = []
PPP_kof = []
Info = []

with open ("test.csv", encoding="utf8") as f:
    contents_f = csv.reader(f)
    for entry in contents_f:
        Countries.append(entry[0])
        PPP_kof.append(entry[1])
        Info.append(entry[2])    

root = Tk()   

mainframe = ttk.Frame(root, padding="3")
mainframe.grid(column=0, row=0)
root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)

DestPPP = StringVar()
DestPPP.set(Info[0]) #default PPP
DestCountPPP = ttk.Entry(mainframe, width=10, justify=CENTER, text=DestPPP).grid(column=2, row=1, sticky=(W, E))
#Choise of country
Choise = StringVar()
ttk.Combobox(mainframe, width=20, justify=CENTER, values=Countries, textvariable=Choise, state="readonly").grid(column=2, row=2, sticky=(W, E))
#Entry of cost
Cost = StringVar()
Expenses = ttk.Entry(mainframe, width=10, justify=CENTER, textvariable=Cost).grid(column=2, row=3, sticky=(W, E))
#Adapted cost
Answer = DoubleVar()
Result = Entry(mainframe, width=10, justify=CENTER, font=('bold'), text=Answer,state='disabled')
Result.config(disabledbackground="lightgreen")
Result.grid(column=2, row=4, sticky=(W, E))

#Info label
#strangely enough Info[1] in the label text shows value then opening from Mother program
ttk.Label(mainframe, text="* According to " + Info[1] + " data", justify=LEFT).grid(column=1, columnspan=2, row=5, sticky=W, padx=10)

#Buttons frame
BttFrame = ttk.Frame(root, padding="3")
BttFrame.grid(row=1)
#Function for converting cost
def Convert():
    xPPP = float(DestPPP.get().replace(',','.'))
    xCost = float(Cost.get().replace(',','.'))
    xDestCountKof = float(PPP_kof[Countries.index(Choise.get())])
    x = DoubleVar()
    x = xCost * (xPPP/xDestCountKof)
    x = round(x, 4)
    Answer.set(x)

ttk.Button(BttFrame, text="Convert", command=Convert).grid(column=1, row=1, pady=5)

root.mainloop()