【问题标题】:PYTHON TKINTER > e = Entry() > e.bind('<ENTER>', function)PYTHON TKINTER > e = Entry() > e.bind('<ENTER>', 函数)
【发布时间】:2021-04-08 15:33:34
【问题描述】:

我还不能在问题帖子中添加图片。

下面的问题:

我的应用当前使用一个在类中编码的窗口。

我的最终目标是在将字母和数字输入到条目小部件时按 Enter,然后按 Enter,然后该功能将更新与我的主窗口中的标签相关的文本。

详细说明如下:

我不知道如何创建和输入,然后绑定输入键,这样当我运行我的应用程序时,我可以单击输入,输入一个值并按 Enter。

我看到很多按钮引用并且我可以让按钮工作,但我正在尝试学习如何做事并且不想在这种情况下依赖按钮。

我在其他一些帖子中看到,如果您使用条目对象调用.get,python 代码将执行它并继续前进。我在按回车键时要调用的函数中使用 print 语句进行了测试,并且在我在 entry 小部件中键入任何内容之前,该 print 语句出现在终端中。然后我尝试输入并按回车,没有任何反应。

我应该放弃绑定 ENTER 键并作为规则坚持使用 tkinter 中的按钮,还是有适当的方法来做到这一点?在我的代码示例中,您将看到 up_R 是我在按下 Enter 时尝试执行的函数。如果我使用up_R(),它会立即执行。如果我使用up_R,则会收到 TCL 错误。

具体部分代码如下:

def up_R():
    print('Makes it here')
    self.R.update_disp(self.e.get())
            
self.e.bind('<ENTER>',up_R)

如果需要帮助,完整代码如下:

#NOAA SPACE WEATHER CONDITIONS

from tkinter import *


class window:
    
    def __init__(self):
        
        #main window
        self.window = Tk()
        self.window.title('NOAA SPACE WEATHER CONDITIONS')
        self.window.geometry('800x600')
        
        #window organization
        self.window.grid_rowconfigure(0, weight = 1)
        self.window.grid_rowconfigure(1, weight = 1)
        
        self.window.grid_columnconfigure(0, weight = 1)
        self.window.grid_columnconfigure(1, weight = 1)
        
        #temp entry frame
        self.e = Entry(self.window)
        self.e.grid(row = 1, column = 0, sticky=N)
        self.e.insert(END, 'R entry')              
        
        
        #init class R
        self.R = R()
        
        #init class S
        self.S = S()
        
        #init class g
        self.G = G()
        
        #frame for RSG
        self.frame = Frame(self.window)
        self.frame.grid(row = 0, column = 0, columnspan = 2, padx=10, pady=10)
        
        #disp class R
        self.rf = Frame(self.frame, highlightbackground='black', highlightcolor='black', highlightthickness=1)
        self.rf.pack(side = LEFT)
        
        self.rl = Label(self.rf, text = self.R.dkey, bg='#caf57a')
        self.rl.pack(side=TOP)
        
        self.rl_lower = Label(self.rf, text= self.R.tile_text, bg='#caf57a')
        self.rl.pack(side=BOTTOM)
        
        #Value update methods
#        self.R.update_disp(self.e.get()) 
        
        
#        #action
        def up_R():
            print('Makes it here')
            self.R.update_disp(self.e.get())
            
        self.e.bind('<ENTER>',up_R())
        
        #main window call - goes at end of class
        self.window.mainloop()


class R:
    def __init__(self):
        d = {'R':'None','R1':'Minor','R2':'Moderate','R3':'Strong','R4':'Severe','R5':'Extreme'}

        self.dkey = 'R'
        self.tile_text = d[self.dkey]
        print(d[self.dkey])
    
    def update_disp(self, dkey):
        self.dkey = dkey
        



class S:
    d = {'S1':'Minor','S2':'Moderate','S3':'Strong','S4':'Severe','S5':'Extreme'}
    pass
    

class G:
    d = {'G1':'Minor','G2':'Moderate','G3':'Strong','G4':'Severe','G5':'Extreme'}
    pass


t = window()

【问题讨论】:

  • 我刚刚整理了你的帖子。代码块需要要么缩进用三个反引号(```)围起来,而不是两者兼而有之。请注意,这些必须是 反引号,而不是单引号 (')。
  • self.e.bind('&lt;ENTER&gt;',up_R()) 应该改为 self.e.bind('&lt;Return&gt;', lambda e: up_R())

标签: python tkinter tkinter-entry


【解决方案1】:

ENTER 应该用 Return 来改变,函数应该接受一个事件

另外,不要忘记在“类”中在方法中使用 self 并在 self.method 中调用它。

     def up_R(self, event):
            print('Makes it here')
            self.R.update_disp(self.e.get())
            self.rl.config(text=self.R.dkey)
            
        self.e.bind('<Return>', self.up_R)

【讨论】:

  • 谢谢。我试过这个,我没有遇到同样的问题。但是,我似乎有放置问题或订单问题。我要么得到一个未定义 up_R 的错误。我会尝试使用 entry 和 def 来看看我是否可以让它工作。根据已发送的内容,我在正确的范围内,但除了你们提供的答案之外,我做错了一些事情。
  • “受信任的社区成员”批准后,我进行了编辑以使答案适用于 Python 类。
猜你喜欢
  • 1970-01-01
  • 2015-09-29
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-15
  • 1970-01-01
相关资源
最近更新 更多