labelImg icon indicating copy to clipboard operation
labelImg copied to clipboard

Hotkeys for labels

Open JesperChristensen89 opened this issue 7 years ago • 2 comments

Instead having the dialog open and pressinh enter each time, it would be nice if one could simply use 1, 2, 3 etc. for bbox labels. Would this be possible?

JesperChristensen89 avatar Feb 22 '18 19:02 JesperChristensen89

I'm not sure, but you're more than welcome to try 😊

vdalv avatar May 13 '18 18:05 vdalv

Base on v1.8.6, hotkeys including 1-5.

diff --git a/labelImg.py b/labelImg.py
index 915ca04..56d1505 100644
--- a/labelImg.py
+++ b/labelImg.py
@@ -103,6 +103,9 @@ class MainWindow(QMainWindow, WindowMixin):
         self.cur_img_idx = 0
         self.img_count = 1
 
+        # Number hotkeys
+        self.hotkey_number = 0
+
         # Whether we need to save or not.
         self.dirty = False
 
@@ -270,6 +273,17 @@ class MainWindow(QMainWindow, WindowMixin):
         edit_mode = action(get_str('editBox'), self.set_edit_mode,
                            'Ctrl+J', 'edit', get_str('editBoxDetail'), enabled=False)
 
+        create_1 = action(get_str('crtBox'), self.create_shape_1,
+                        '1', 'new', get_str('crtBoxDetail'), enabled=True)
+        create_2 = action(get_str('crtBox'), self.create_shape_2,
+                        '2', 'new', get_str('crtBoxDetail'), enabled=True)
+        create_3 = action(get_str('crtBox'), self.create_shape_3,
+                        '3', 'new', get_str('crtBoxDetail'), enabled=True)
+        create_4 = action(get_str('crtBox'), self.create_shape_4,
+                        '4', 'new', get_str('crtBoxDetail'), enabled=True)
+        create_5 = action(get_str('crtBox'), self.create_shape_5,
+                        '5', 'new', get_str('crtBoxDetail'), enabled=True)
+
         create = action(get_str('crtBox'), self.create_shape,
                         'w', 'new', get_str('crtBoxDetail'), enabled=False)
         delete = action(get_str('delBox'), self.delete_selected_shape,
@@ -357,6 +371,7 @@ class MainWindow(QMainWindow, WindowMixin):
         # Store actions for further handling.
         self.actions = Struct(save=save, save_format=save_format, saveAs=save_as, open=open, close=close, resetAll=reset_all, deleteImg=delete_image,
                               lineColor=color1, create=create, delete=delete, edit=edit, copy=copy,
+                              create_1=create_1,create_2=create_2,create_3=create_3,create_4=create_4,create_5=create_5,
                               createMode=create_mode, editMode=edit_mode, advancedMode=advanced_mode,
                               shapeLineColor=shape_line_color, shapeFillColor=shape_fill_color,
                               zoom=zoom, zoomIn=zoom_in, zoomOut=zoom_out, zoomOrg=zoom_org,
@@ -422,6 +437,7 @@ class MainWindow(QMainWindow, WindowMixin):
         self.tools = self.toolbar('Tools')
         self.actions.beginner = (
             open, open_dir, change_save_dir, open_next_image, open_prev_image, verify, save, save_format, None, create, copy, delete, None,
+            create_1,create_2,create_3,create_4,create_5,
             zoom_in, zoom, zoom_out, fit_window, fit_width)
 
         self.actions.advanced = (
@@ -669,6 +685,31 @@ class MainWindow(QMainWindow, WindowMixin):
     def show_shortcuts_dialog(self):
         self.show_tutorial_dialog(browser='default', link='https://github.com/tzutalin/labelImg#Hotkeys')
 
+    def create_shape_1(self):
+        self.set_hotkey_number(1)
+        if self.actions.create.isEnabled():
+            self.create_shape()
+
+    def create_shape_2(self):
+        self.set_hotkey_number(2)
+        if self.actions.create.isEnabled():
+            self.create_shape()
+
+    def create_shape_3(self):
+        self.set_hotkey_number(3)
+        if self.actions.create.isEnabled():
+            self.create_shape()
+
+    def create_shape_4(self):
+        self.set_hotkey_number(4)
+        if self.actions.create.isEnabled():
+            self.create_shape()
+
+    def create_shape_5(self):
+        self.set_hotkey_number(5)
+        if self.actions.create.isEnabled():
+            self.create_shape()
+
     def create_shape(self):
         assert self.beginner()
         self.canvas.set_editing(False)
@@ -919,13 +960,16 @@ class MainWindow(QMainWindow, WindowMixin):
         else:  # User probably changed item visibility
             self.canvas.set_shape_visible(shape, item.checkState() == Qt.Checked)
 
+    def set_hotkey_number(self, number=0):
+        self.hotkey_number = number
+
     # Callback functions:
     def new_shape(self):
         """Pop-up and give focus to the label editor.
 
         position MUST be in global coordinates.
         """
-        if not self.use_default_label_checkbox.isChecked() or not self.default_label_text_line.text():
+        if self.hotkey_number == 0 or self.hotkey_number >= len(self.label_hist) and (not self.use_default_label_checkbox.isChecked() or not self.default_label_text_line.text()):
             if len(self.label_hist) > 0:
                 self.label_dialog = LabelDialog(
                     parent=self, list_item=self.label_hist)
@@ -936,8 +980,12 @@ class MainWindow(QMainWindow, WindowMixin):
             else:
                 text = self.label_dialog.pop_up(text=self.prev_label_text)
                 self.lastLabel = text
-        else:
+        elif self.hotkey_number == 0 or self.hotkey_number >= len(self.label_hist):
             text = self.default_label_text_line.text()
+        else:
+            text = self.label_hist[self.hotkey_number-1]
+
+        self.hotkey_number = 0
 
         # Add Chris
         self.diffc_button.setChecked(False)

JasperMorrison avatar Dec 03 '21 12:12 JasperMorrison