我如何将在标签小部件中输入的数字“获取”到变量中?

时间:2019-09-08 16:08:17

标签: python tkinter

我有2个功能,第二个功能应该在单击第一个功能的按钮后运行。效果很好,但是我需要输入已输入的数字才能放入变量,到目前为止,.get()函数无法正常工作,我不确定该怎么做。

我看过很多不同的示例,包括登录和注册gui的示例,但是它们都无法提供帮助。

from tkinter import *
import tkinter.messagebox as box


def enter_rle_1():

    enter_rle = Tk() #do not remove
    enter_rle.title('Enter RLE') #do not remove

    frame = Frame(enter_rle) #do not remove

    label_linecount = Label(enter_rle,text = 'Linecount:')
    label_linecount.pack(padx=15,pady= 5)

    linecount = Entry(enter_rle,bd =5)
    linecount.pack(padx=15, pady=5)


    ok_button = Button(enter_rle, text="Next", command = linecount_button_clicked)
    ok_button.pack(side = RIGHT , padx =5)


    frame.pack(padx=100,pady = 19)
    enter_rle.mainloop()


def linecount_button_clicked():
     Linecount = linecount.get()

     if int(Linecount) < 3:
            tm.showinfo("Error", "Enter a number over 3")
     elif int(Linecount) > 1000000000:
            tm.showinfo("Error", "Enter a number under 1,000,000,000")
     else:
            print("fdsfd")

enter_rle_1()

我希望会出现一个弹出窗口,告诉我这个数字太大或太小,具体取决于数字是否合适,如果它是一个好数字,我只是将其设置为打印代码,以便在继续前进之前先测试一下是否可以正常工作。

2 个答案:

答案 0 :(得分:0)

为Entry小部件定义一个String变量(确保它是全局定义的):

global linecount_STR
linecount_STR = StringVar()
linecount_STR.set('Enter value here')
linecount = Entry(enter_rle,bd =5,textvariable=linecount_STR)
linecount.pack(padx=15, pady=5)

然后可以用int(linecount_STR.get())读取在此输入的数字。

答案 1 :(得分:0)

我建议使用面向对象的方法,看一下这段代码

#!/usr/bin/python3
import tkinter as tk
from tkinter import ttk
from tkinter import messagebox


class Main(ttk.Frame):
    def __init__(self, parent):
        super().__init__()

        self.parent = parent

        self.vcmd = (self.register(self.validate), '%d', '%P', '%S')

        self.linecount = tk.IntVar()

        self.init_ui()

    def init_ui(self):

        self.pack(fill=tk.BOTH, expand=1)

        f = ttk.Frame()

        ttk.Label(f, text = "Linecount").pack()
        self.txTest = ttk.Entry(f,
                                validate='key',
                                validatecommand=self.vcmd,
                                textvariable=self.linecount).pack()

        w = ttk.Frame()

        ttk.Button(w, text="Next", command=self.on_callback).pack()
        ttk.Button(w, text="Close", command=self.on_close).pack()

        f.pack(side=tk.LEFT, fill=tk.BOTH, expand=1)
        w.pack(side=tk.RIGHT, fill=tk.BOTH, expand=1)


    def on_callback(self,):

        #print ("self.text = {}".format(self.linecount.get()))

        x = self.linecount.get()

        if x < 3:
            msg = "Enter a number over 3"
        elif x > 1000000000:
            msg = "Enter a number under 1,000,000,000"
        else:
            msg = "You ahve enter {0}".format(x)

        messagebox.showinfo(self.parent.title(), msg, parent=self)            


    def on_close(self):
        self.parent.on_exit()


    def validate(self, action, value, text,):
        # action=1 -> insert
        if action == '1':
            if text in '0123456789':
                try:
                    int(value)
                    return True
                except ValueError:
                    return False
            else:
                return False
        else:
            return True        

class App(tk.Tk):
    """Start here"""

    def __init__(self):
        super().__init__()

        self.protocol("WM_DELETE_WINDOW", self.on_exit)

        self.set_title()
        self.set_style()

        frame = Main(self,)
        frame.pack(fill=tk.BOTH, expand=1)

    def set_style(self):
        self.style = ttk.Style()
        #('winnative', 'clam', 'alt', 'default', 'classic', 'vista', 'xpnative')
        self.style.theme_use("clam")

    def set_title(self):
        s = "{0}".format('Enter RLE')
        self.title(s)

    def on_exit(self):
        """Close all"""
        if messagebox.askokcancel(self.title(), "Do you want to quit?", parent=self):
            self.destroy()               

if __name__ == '__main__':
    app = App()
    app.mainloop()

enter image description here

请在开始时注意这一行。...

self.linecount = tk.IntVar()#声明一个整数变量

self.vcmd =(self.register(self.validate),'%d','%P','%S')#注册一个函数以仅允许文本小部件中的整数。