【问题标题】:Allow user to change default text in tkinter entry widget.允许用户更改 tkinter 条目小部件中的默认文本。
【发布时间】:2015-08-04 03:10:49
【问题描述】:

我正在编写一个要求用户输入文件夹名称的 python 脚本。在大多数情况下,默认值就足够了,但我希望出现一个允许用户覆盖默认值的输入框。这是我所拥有的:

from Tkinter import *
import time
def main():
    #some stuff
    def getFolderName():
        master = Tk()
        folderName = Entry(master)
        folderName.pack()
        folderName.insert(END, 'dat' + time.strftime('%m%d%Y'))
        folderName.focus_set()
        createDirectoryName = folderName.get()
        def callback():
            global createDirectoryName
            createDirectoryName = folderName.get()
            return 
        b = Button(master, text="OK and Close", width=10, command=callback)
        b.pack()
        mainloop()
        return createDirectoryName
    getFolderName()

   #other stuff happens....
    return

if __name__ == '__main__':
    main()

我对 tkInter 几乎一无所知,有 2 个问题。

  1. 在回调函数中使用global createDirectoryName 覆盖默认条目是不是最好的方法?
  2. 如何使按钮在按下时关闭窗口。 我试过了

    def callback():
        global createDirectoryName
        createDirectoryName = folderName.get()
        master.destroy
    

但这只会在运行脚本时破坏窗口。

【问题讨论】:

  • 为什么你所有的函数都是嵌套的?

标签: python tkinter


【解决方案1】:

我不知道你在 Tkinter 的经验如何,但我建议你使用类。

try:
    from tkinter import * #3.x
except:
    from Tkinter import * #2.x


class anynamehere(Tk): #you can make the class inherit from Tk directly, 
    def __init__(self): #__init__ is a special methoed that gets called anytime the class does 
        Tk.__init__(self) #it has to be called __init__
        #further code here e.g.
        self.frame = Frame()
        self.frame.pack()
        self.makeUI()
        self.number = 0 # this will work in the class anywhere so you don't need global all the time
    def makeUI(self):
        #code to make the UI
        self.number = 1 # no need for global
        #answer to question No.2
        Button(frame, command = self.destroy).pack()


anyname = anynamehere() #remember it alredy has Tk
anyname.mainloop()

为什么还要覆盖默认的 Entry 行为? 解决方案是制作另一个按钮并像这样将命令绑定到它

    self.enteredtext = StringVar()
    self.entry = Entry(frame, textvariable = self.enteredtext)
    self.entry.pack()
    self.button = Button(frame, text = "Submit", command = self.getfolder, #someother options, check tkitner documentation for full list)
    self.button.pack()
def getfolder(self): #make the UI in one method, command in other I suggest
    text = self.enteredtext.get()
    #text now has whats been entered to the entry, do what you need to with it

【讨论】:

    猜你喜欢
    • 2013-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 2019-11-11
    相关资源
    最近更新 更多