【问题标题】:Is there a way to convert a entry textbox in tkinter into a variable有没有办法将 tkinter 中的条目文本框转换为变量
【发布时间】:2021-07-17 03:02:38
【问题描述】:

我试图打印 x、y、z 和 w,然后在输入小部件中按一个按钮为它们分配一个数字,所以一旦我按下按钮 x、y、z 和 w 就会打印

Curve1_lb = Label(canvas,text='Curve 1')
Curve1 = Entry(canvas)

Curve2_lb = Label(canvas,text='Curve 2')
Curve2 = Entry(canvas)

Curve3_lb = Label(canvas,text='Curve 3')
Curve3 = Entry(canvas)

Curve4_lb = Label(canvas, text='Curve 4')
Curve4 = Entry(canvas)

Curve1.pack()  
Curve2.pack() 
Curve3.pack()
Curve4.pack()
Curve1_lb.pack()
Curve2_lb.pack()
Curve3_lb.pack() 
Curve4_lb.pack() 

x = Curve1
y = Curve2
z = Curve3 
w = Curve4   

btn = Button(canvas,text='Print',relief=SOLID, command = prints)
btn.pack(pady=10)
                                                                                   
def prints():
    print(x)
    print(y)
    print(z)
    print(w)

【问题讨论】:

  • 最好为此使用 tkinter 变量
  • @PCM 这里不需要tkinter 变量。在tkinter.Entry 中使用tkinter 变量的唯一情况是您需要跟踪该变量。将tkinter 变量添加到条目而不跟踪该变量是完全没用的。

标签: python tkinter tkinter-entry


【解决方案1】:

在您的代码中,x 只是对Curve1 小部件的另一个引用。要获取小部件的内容,您必须调用get

from tkinter import *

canvas = Tk()

Curve1_lb = Label(canvas,text='Curve 1')
Curve1 = Entry(canvas)

Curve2_lb = Label(canvas,text='Curve 2')
Curve2 = Entry(canvas)

Curve3_lb = Label(canvas,text='Curve 3')
Curve3 = Entry(canvas)

Curve4_lb = Label(canvas, text='Curve 4')
Curve4 = Entry(canvas)

Curve1_lb.pack()
Curve1.pack()
Curve2_lb.pack()
Curve2.pack()
Curve3_lb.pack()
Curve3.pack()
Curve4_lb.pack()
Curve4.pack()

def prints():
    print(Curve1.get())
    print(Curve2.get())
    print(Curve3.get())
    print(Curve4.get())

btn = Button(canvas,text='Print',relief=SOLID, command = prints)
btn.pack(pady=10)

canvas.mainloop()

还可以在小部件和局部变量之间创建“实时”连接,但这在这里并不是必需的。

【讨论】:

    【解决方案2】:

    尝试使用 x 作为

    x = Curve1.get("1.0","end") #this will get all the text in the entry widget
    print(x)
    

    【讨论】:

    • 调用<tkinter.Entry>.get()时不能传入任何参数。您正在考虑需要 2 个参数的 <tkinter.Text>.get()
    【解决方案3】:

    我不会说这是更好的方法,而是替代方法。它有点冗长,但请尝试一次,它可以替代您的代码。

    from tkinter import *
    
    canvas = Tk()
    
    c1=StringVar()
    c2=StringVar()
    c3=StringVar()
    c4=StringVar()
    
    Curve1_lb = Label(canvas,text='Curve 1')
    Curve1 = Entry(canvas,textvariable=c1)
    Curve1_lb.pack()
    Curve1.pack()
    
    Curve2_lb = Label(canvas,text='Curve 2')
    Curve2 = Entry(canvas,textvariable=c2)
    Curve2_lb.pack()
    Curve2.pack()
    
    Curve3_lb = Label(canvas,text='Curve 3')
    Curve3 = Entry(canvas,textvariable=c3)
    Curve3_lb.pack()
    Curve3.pack()
    
    Curve4_lb = Label(canvas, text='Curve 4')
    Curve4 = Entry(canvas,textvariable=c4)
    Curve4_lb.pack()
    Curve4.pack()
    
    def prints():
        print(c1.get())
        print(c2.get())
        print(c3.get())
        print(c4.get())
    
    btn = Button(canvas,text='Print',relief=SOLID, command = prints)
    btn.pack(pady=10)
    
    canvas.mainloop()
    

    我们正在为每个条目创建新变量并将其分别保存在c1c2c3c4

    【讨论】:

    • 如果您不打算跟踪它,那么使用 StringVar 并将其附加到条目是没有意义的。使用<tkinter.Entry>.get() 要简单得多。在这种情况下使用StringVar 是完全没有意义的,并且会使您的代码更长。
    • 是的!我知道,我已经告诉 OP 这也是在回答!
    • 不,我告诉 OP 有解决问题的替代方案,是提供替代方案错误吗?如果没有StringVar() 的值,那么为什么要这样做?我只是告诉 OP 有这种选择,而不是 tim 的答案只是解决您问题的答案!
    • StringVar() 没有用处,除非您在其上调用 .trace(...)(如果您将其附加到条目中)
    • 那我应该删除我的答案吗?
    猜你喜欢
    • 2017-05-15
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    • 2023-03-17
    • 2017-12-21
    • 1970-01-01
    相关资源
    最近更新 更多