将函数结果传递给tkinter GUI文本小部件python3

时间:2019-11-26 19:21:03

标签: python tkinter

我是编程新手,如果这是一个显而易见的错误,我深表歉意。 我正在运行Windows 10 64bit的计算机上使用python 3.7.4(带有Thonny和/ IDLE)在tkinter上编写GUI。

我正在尝试第一次编写GUI,但遇到以下问题:

我编写了一个程序,以在c驱动器上查找任何给定的文档,打开/读取文本,计算字符数,然后显示结果。 只要我使用tkinter框架小部件,此方法就可以正常工作,但是框架小部件不允许使用滚动条(我看到了一些解决方案,这些问题就在我头上),因此我决定使用文本小部件。一行:

label2["text"] = a,"+", b, "+", c, "+", d, "=" , e 

由于某种原因而无法使用,而且由于我不明白为什么它首先会起作用,所以我不确定为什么现在不起作用。

为了进行一些测试,我创建了一个稍微容易一些的代码来测试相同的问题:

import tkinter as tk
import random as rd

def fun9(d):
    a= rd.randint(1,10)
    b= rd.randint(1,10)
    c= rd.randint(1,10)
    #d= int(entry.get())
    e=a+b+c+d
    #label2["text"] = a,"+", b, "+", c, "+", d, "=" , e ### <-
    #label2.config(text = (a,"+", b, "+", c, "+", d, "=" , e))
    print(a,"+", b, "+", c, "+", d, "=" , e)
    return a,"+", b, "+", c, "+", d, "=" , e



root = tk.Tk() # root window?? -> opens window
root.geometry("%dx%d" % (800, 800))

# now write all functions
canvas = tk.Canvas(root) # create canvas for button
canvas.pack()

frame1 = tk.Frame(root, bg="#99ceff", bd=5)
frame1.place(relx=0.125, rely=0, relwidth=0.75, relheight=0.3)

label = tk.Label(frame1, font=20, text="here a, b, c and d are added: ")
label.place(relheight=1, relwidth=1)

frame2 = tk.Frame(root, bg="#99ceff", bd=5)
frame2.place(relx=0.5, rely=0.32, relwidth=0.75, relheight=0.1, anchor="n")

entry=tk.Entry(frame2, font=40, bd=5)# puts entry in frame instead of root
entry.place(relwidth=0.65, relheight=1)

button = tk.Button(root, text="Search and Display", bg="lightblue", font=40, command=lambda: fun9(int(entry.get()))) # creates button
button.place(relx=0.62, rely=0.32, relheight=0.1, relwidth=0.25) # places button in window

frame3 = tk.Frame(root, bg="#99ceff", bd=5)
frame3.place(relx=0.125, rely=0.45, relwidth=0.75, relheight=0.4)

#label2 = tk.Label(frame3, font=20)
#label2.place(relheight=1, relwidth=1)

label2 = tk.Text(frame3, font=20)
label2.pack()
label2.insert("1.0", fun9(int(entry.get())))
#label2.config(state="disabled")

root.mainloop()    

错误消息显示为:

ValueError: invalid literal for int() with base 10: ''

据我所知,该行中的输入

label2.insert("1.0", fun9(int(entry.get())))

不获取输入值,我真的不明白为什么。我已经尝试解决了过去3天的问题,并且在这里和其他地方都读了几个小时,但找不到答案(或者至少我没有一个答案)。

非常感谢您的帮助,非常感谢

JD

ps:单击该按钮将允许程序在命令提示符中执行其工作,而不仅仅是在gui框架中(显然忽略了文本小部件)

2 个答案:

答案 0 :(得分:0)

正在发生的一个核心问题是fun9()返回一个元组,然后您尝试将该元组转换为int类型(第68行)。

答案 1 :(得分:0)

这是我从一个朋友那里得到的答案,他是软件开发人员,所以我对此不以为然!仍然也许这会在将来对其他人有所帮助,这就是为什么我在这里发布它:

df %>% 
  left_join(df2, by = "R") %>% 
  filter(lubridate::dmy(D) >= lubridate::dmy(DD) & lubridate::dmy(D) <= lubridate::dmy(DF)) %>% 
  group_by(R,D) %>% 
  filter(PDF2 == min(PDF2)) %>% 
  ungroup()