You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Gtk3中实现按下Enter键触发函数的技术求助

实现Enter键触发Gtk3注射时间计算器的计算功能

要实现按下Enter键调用Click()函数或者触发calculateButton的点击事件,有两种简单可靠的方法,同时我也会帮你优化原代码中使用global变量的不规范写法,改用实例属性来管理控件,让代码更易维护。

方法1:设置默认按钮(推荐)

Gtk中可以将按钮设置为窗口的默认按钮,这样当用户在任何输入控件中按下Enter键时,都会自动触发该按钮的clicked信号。只需要在创建calculateButton后添加两行代码:

calculateButton.set_can_default(True)
calculateButton.grab_default()

方法2:给输入框绑定键盘事件

如果只想在特定输入框按下Enter时触发计算,可以给每个输入框绑定key-press-event信号,检测按键是否为Enter(键码是Gdk.KEY_Return或Gdk.KEY_KP_Enter),如果是则调用计算函数。

修改后的完整代码

下面是整合了方法1(默认按钮)并优化了变量管理的完整代码:

import gi
import math
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk

class TableWindow(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self, title="Injection Time Calculator")
        table = Gtk.Table(7, 2, True)
        self.add(table)
        
        # 初始化控件并设置为实例属性,替代全局变量
        self.sizeLabel = Gtk.Label("WALL SIZE")
        self.widthLabel = Gtk.Label("WIDTH")
        self.heightLabel = Gtk.Label("HEIGHT")
        self.fsLabel = Gtk.Label("FLAT STUD?")
        self.ecLabel = Gtk.Label("EC?")
        self.injLabel = Gtk.Label()
        
        self.heightEntry = Gtk.Entry()
        self.widthEntry = Gtk.Entry()
        
        self.sizeBox = Gtk.ComboBoxText()
        self.sizeBox.append("1","90")
        self.sizeBox.append("2","140")
        self.sizeBox.append("3","219")
        
        self.fsCheckButton = Gtk.CheckButton()
        self.ecCheckButton = Gtk.CheckButton()
        
        self.calculateButton = Gtk.Button.new_with_label("CALCULATE INJECTION TIME")
        self.calculateButton.connect("clicked", self.Click)
        
        # 设置按钮为默认按钮,按下Enter自动触发点击
        self.calculateButton.set_can_default(True)
        self.calculateButton.grab_default()
        
        # 布局控件
        table.attach(self.sizeLabel, 0, 1, 0, 1)
        table.attach(self.widthLabel, 0, 1, 1, 2)
        table.attach(self.heightLabel, 0, 1, 2, 3)
        table.attach(self.fsLabel, 0, 1, 3, 4)
        table.attach(self.injLabel, 0, 2, 6, 7)
        table.attach(self.ecLabel, 0, 1, 4, 5)
        table.attach(self.calculateButton, 0, 2, 5, 6)
        table.attach(self.widthEntry, 1, 2, 1, 2)
        table.attach(self.heightEntry, 1, 2, 2, 3)
        table.attach(self.sizeBox, 1, 2, 0, 1)
        table.attach(self.fsCheckButton, 1, 2, 3, 4)
        table.attach(self.ecCheckButton, 1, 2, 4, 5)

    def Click(self, widget):
        studWidth = self.sizeBox.get_active_text()
        areaHeight = self.heightEntry.get_text()
        areaWidth = self.widthEntry.get_text()
        
        # 添加输入验证,避免无效数字导致程序崩溃
        try:
            areaHeight = float(areaHeight)
            areaWidth = float(areaWidth)
        except ValueError:
            self.injLabel.set_text("请输入有效的数字!")
            return
        
        if self.fsCheckButton.get_active():
            if studWidth == "90":
                areaWidth -= 59
            elif studWidth == "140":
                areaWidth -= 38
            elif studWidth == "219":
                areaWidth -= 24.3
        
        if self.ecCheckButton.get_active():
            if studWidth == "90":
                areaWidth -= 2 * 59
            elif studWidth == "140":
                areaWidth -= 2 * 38
            elif studWidth == "219":
                areaWidth -= 2 * 24.3
        
        timeVar = float(studWidth) * 10.7 / 140
        injTime = ((areaWidth * areaHeight * timeVar) / 1000000)
        result_text = f'INJECTION TIME IS {str(injTime)[:7]} SECONDS OR {(math.ceil(injTime*5))/5} ROUNDED'
        self.injLabel.set_text(result_text)
        
        self.fsCheckButton.set_active(False)
        self.ecCheckButton.set_active(False)

win = TableWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()

代码改动说明

  1. 替换全局变量为实例属性:将所有控件变量改为self.xxx,避免使用global,让代码更符合面向对象规范,也避免变量冲突。
  2. 添加默认按钮设置:通过set_can_default(True)和grab_default()让计算按钮成为默认按钮,按下Enter即可触发计算。
  3. 增加输入验证:添加try-except块处理无效数字输入,避免程序崩溃。
  4. 优化字符串格式化:使用f-string让结果文本更易读。

如果你想使用方法2(仅特定输入框按Enter触发),可以给输入框添加如下绑定:

def on_entry_key_press(self, widget, event):
    if event.keyval == Gdk.KEY_Return or event.keyval == Gdk.KEY_KP_Enter:
        self.Click(self.calculateButton)
        return True  # 阻止事件继续传递

# 在初始化输入框后添加:
self.heightEntry.connect("key-press-event", self.on_entry_key_press)
self.widthEntry.connect("key-press-event", self.on_entry_key_press)

这样在heightEntry或widthEntry中按下Enter时就会触发计算。

内容的提问来源于stack exchange,提问作者Nathan Ditzel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:37:31