sticker-convert 2.8.0__py3-none-any.whl → 2.8.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. sticker_convert/cli.py +4 -0
  2. sticker_convert/converter.py +8 -8
  3. sticker_convert/downloaders/download_base.py +3 -7
  4. sticker_convert/downloaders/download_kakao.py +3 -4
  5. sticker_convert/downloaders/download_line.py +3 -4
  6. sticker_convert/downloaders/download_signal.py +3 -4
  7. sticker_convert/downloaders/download_telegram.py +3 -4
  8. sticker_convert/gui.py +3 -1
  9. sticker_convert/gui_components/windows/advanced_compression_window.py +117 -101
  10. sticker_convert/job.py +81 -89
  11. sticker_convert/job_option.py +3 -0
  12. sticker_convert/resources/compression.json +11 -0
  13. sticker_convert/resources/help.json +1 -0
  14. sticker_convert/uploaders/compress_wastickers.py +3 -4
  15. sticker_convert/uploaders/upload_base.py +2 -8
  16. sticker_convert/uploaders/upload_signal.py +3 -4
  17. sticker_convert/uploaders/upload_telegram.py +3 -4
  18. sticker_convert/uploaders/xcode_imessage.py +3 -4
  19. sticker_convert/utils/callback.py +33 -21
  20. sticker_convert/utils/media/codec_info.py +3 -7
  21. sticker_convert/version.py +1 -1
  22. {sticker_convert-2.8.0.dist-info → sticker_convert-2.8.2.dist-info}/METADATA +18 -15
  23. {sticker_convert-2.8.0.dist-info → sticker_convert-2.8.2.dist-info}/RECORD +27 -27
  24. {sticker_convert-2.8.0.dist-info → sticker_convert-2.8.2.dist-info}/LICENSE +0 -0
  25. {sticker_convert-2.8.0.dist-info → sticker_convert-2.8.2.dist-info}/WHEEL +0 -0
  26. {sticker_convert-2.8.0.dist-info → sticker_convert-2.8.2.dist-info}/entry_points.txt +0 -0
  27. {sticker_convert-2.8.0.dist-info → sticker_convert-2.8.2.dist-info}/top_level.txt +0 -0
sticker_convert/cli.py CHANGED
@@ -119,6 +119,7 @@ class CLI:
119
119
  "duration_max",
120
120
  "vid_size_max",
121
121
  "img_size_max",
122
+ "padding_percent",
122
123
  )
123
124
  flags_comp_float = ("fps_power", "res_power", "quality_power", "color_power")
124
125
  flags_comp_str = (
@@ -372,6 +373,9 @@ class CLI:
372
373
  bg_color=self.compression_presets[preset]["bg_color"]
373
374
  if args.bg_color is None
374
375
  else args.bg_color,
376
+ padding_percent=self.compression_presets[preset]["padding_percent"]
377
+ if args.padding_percent is None
378
+ else args.padding_percent,
375
379
  steps=self.compression_presets[preset]["steps"]
376
380
  if args.steps is None
377
381
  else args.steps,
@@ -4,7 +4,6 @@ from fractions import Fraction
4
4
  from io import BytesIO
5
5
  from math import ceil, floor
6
6
  from pathlib import Path
7
- from queue import Queue
8
7
  from typing import TYPE_CHECKING, Any, Dict, List, Literal, Optional, Tuple, Union, cast
9
8
 
10
9
  import numpy as np
@@ -12,7 +11,7 @@ from PIL import Image
12
11
  from PIL import __version__ as PillowVersion
13
12
 
14
13
  from sticker_convert.job_option import CompOption
15
- from sticker_convert.utils.callback import Callback, CallbackReturn, CbQueueItemType
14
+ from sticker_convert.utils.callback import CallbackProtocol, CallbackReturn
16
15
  from sticker_convert.utils.files.cache_store import CacheStore
17
16
  from sticker_convert.utils.media.codec_info import CodecInfo, rounding
18
17
  from sticker_convert.utils.media.format_verify import FormatVerify
@@ -120,7 +119,7 @@ class StickerConvert:
120
119
  in_f: Union[Path, Tuple[Path, bytes]],
121
120
  out_f: Path,
122
121
  opt_comp: CompOption,
123
- cb: "Union[Queue[CbQueueItemType], Callback]",
122
+ cb: CallbackProtocol,
124
123
  # cb_return: CallbackReturn
125
124
  ) -> None:
126
125
  self.in_f: Union[bytes, Path]
@@ -186,7 +185,7 @@ class StickerConvert:
186
185
  in_f: Union[Path, Tuple[Path, bytes]],
187
186
  out_f: Path,
188
187
  opt_comp: CompOption,
189
- cb: "Union[Queue[CbQueueItemType], Callback]",
188
+ cb: CallbackProtocol,
190
189
  _cb_return: CallbackReturn,
191
190
  ) -> Tuple[bool, Path, Union[None, bytes, Path], int]:
192
191
  sticker = StickerConvert(in_f, out_f, opt_comp, cb)
@@ -598,12 +597,13 @@ class StickerConvert:
598
597
  if self.res_h is None:
599
598
  self.res_h = height
600
599
 
600
+ scaling = 1 - (self.opt_comp.padding_percent / 100)
601
601
  if width > height:
602
- width_new = self.res_w
603
- height_new = height * self.res_w // width
602
+ width_new = int(self.res_w * scaling)
603
+ height_new = int(height * self.res_w // width * scaling)
604
604
  else:
605
- height_new = self.res_h
606
- width_new = width * self.res_h // height
605
+ height_new = int(self.res_h * scaling)
606
+ width_new = int(width * self.res_h // height * scaling)
607
607
 
608
608
  with im.resize((width_new, height_new), resample=resample) as im_resized:
609
609
  with Image.new(
@@ -2,13 +2,12 @@
2
2
  from __future__ import annotations
3
3
 
4
4
  from pathlib import Path
5
- from queue import Queue
6
- from typing import Any, List, Optional, Tuple, Union
5
+ from typing import Any, List, Optional, Tuple
7
6
 
8
7
  import requests
9
8
 
10
9
  from sticker_convert.job_option import CredOption
11
- from sticker_convert.utils.callback import Callback, CallbackReturn, CbQueueItemType
10
+ from sticker_convert.utils.callback import CallbackProtocol, CallbackReturn
12
11
 
13
12
 
14
13
  class DownloadBase:
@@ -17,10 +16,7 @@ class DownloadBase:
17
16
  url: str,
18
17
  out_dir: Path,
19
18
  opt_cred: Optional[CredOption],
20
- cb: Union[
21
- Queue[CbQueueItemType],
22
- Callback,
23
- ],
19
+ cb: CallbackProtocol,
24
20
  cb_return: CallbackReturn,
25
21
  ) -> None:
26
22
  self.url = url
@@ -5,8 +5,7 @@ import json
5
5
  import zipfile
6
6
  from io import BytesIO
7
7
  from pathlib import Path
8
- from queue import Queue
9
- from typing import Any, List, Optional, Tuple, Union
8
+ from typing import Any, List, Optional, Tuple
10
9
  from urllib.parse import urlparse
11
10
 
12
11
  import requests
@@ -15,7 +14,7 @@ from bs4.element import Tag
15
14
 
16
15
  from sticker_convert.downloaders.download_base import DownloadBase
17
16
  from sticker_convert.job_option import CredOption
18
- from sticker_convert.utils.callback import Callback, CallbackReturn, CbQueueItemType
17
+ from sticker_convert.utils.callback import CallbackProtocol, CallbackReturn
19
18
  from sticker_convert.utils.files.metadata_handler import MetadataHandler
20
19
  from sticker_convert.utils.media.decrypt_kakao import DecryptKakao
21
20
 
@@ -249,7 +248,7 @@ class DownloadKakao(DownloadBase):
249
248
  url: str,
250
249
  out_dir: Path,
251
250
  opt_cred: Optional[CredOption],
252
- cb: "Union[Queue[CbQueueItemType], Callback]",
251
+ cb: CallbackProtocol,
253
252
  cb_return: CallbackReturn,
254
253
  ) -> bool:
255
254
  downloader = DownloadKakao(url, out_dir, opt_cred, cb, cb_return)
@@ -7,8 +7,7 @@ import string
7
7
  import zipfile
8
8
  from io import BytesIO
9
9
  from pathlib import Path
10
- from queue import Queue
11
- from typing import Any, Dict, List, Optional, Tuple, Union
10
+ from typing import Any, Dict, List, Optional, Tuple
12
11
  from urllib import parse
13
12
 
14
13
  import requests
@@ -18,7 +17,7 @@ from PIL import Image
18
17
  from sticker_convert.downloaders.download_base import DownloadBase
19
18
  from sticker_convert.job_option import CredOption
20
19
  from sticker_convert.utils.auth.get_line_auth import GetLineAuth
21
- from sticker_convert.utils.callback import Callback, CallbackReturn, CbQueueItemType
20
+ from sticker_convert.utils.callback import CallbackProtocol, CallbackReturn
22
21
  from sticker_convert.utils.files.metadata_handler import MetadataHandler
23
22
  from sticker_convert.utils.media.apple_png_normalize import ApplePngNormalize
24
23
 
@@ -466,7 +465,7 @@ class DownloadLine(DownloadBase):
466
465
  url: str,
467
466
  out_dir: Path,
468
467
  opt_cred: Optional[CredOption],
469
- cb: "Union[Queue[CbQueueItemType], Callback]",
468
+ cb: CallbackProtocol,
470
469
  cb_return: CallbackReturn,
471
470
  ) -> bool:
472
471
  downloader = DownloadLine(url, out_dir, opt_cred, cb, cb_return)
@@ -1,7 +1,6 @@
1
1
  #!/usr/bin/env python3
2
2
  from pathlib import Path
3
- from queue import Queue
4
- from typing import Dict, Optional, Union
3
+ from typing import Dict, Optional
5
4
 
6
5
  import anyio
7
6
  from signalstickers_client import StickersClient # type: ignore
@@ -10,7 +9,7 @@ from signalstickers_client.models import StickerPack # type: ignore
10
9
 
11
10
  from sticker_convert.downloaders.download_base import DownloadBase
12
11
  from sticker_convert.job_option import CredOption
13
- from sticker_convert.utils.callback import Callback, CallbackReturn, CbQueueItemType
12
+ from sticker_convert.utils.callback import CallbackProtocol, CallbackReturn
14
13
  from sticker_convert.utils.files.metadata_handler import MetadataHandler
15
14
  from sticker_convert.utils.media.codec_info import CodecInfo
16
15
 
@@ -86,7 +85,7 @@ class DownloadSignal(DownloadBase):
86
85
  url: str,
87
86
  out_dir: Path,
88
87
  opt_cred: Optional[CredOption],
89
- cb: "Union[Queue[CbQueueItemType], Callback]",
88
+ cb: CallbackProtocol,
90
89
  cb_return: CallbackReturn,
91
90
  ) -> bool:
92
91
  downloader = DownloadSignal(url, out_dir, opt_cred, cb, cb_return)
@@ -1,6 +1,5 @@
1
1
  #!/usr/bin/env python3
2
2
  from pathlib import Path
3
- from queue import Queue
4
3
  from typing import Dict, Optional, Union
5
4
  from urllib.parse import urlparse
6
5
 
@@ -11,7 +10,7 @@ from telegram.ext import AIORateLimiter, ApplicationBuilder
11
10
 
12
11
  from sticker_convert.downloaders.download_base import DownloadBase
13
12
  from sticker_convert.job_option import CredOption
14
- from sticker_convert.utils.callback import Callback, CallbackReturn, CbQueueItemType
13
+ from sticker_convert.utils.callback import CallbackProtocol, CallbackReturn
15
14
  from sticker_convert.utils.files.metadata_handler import MetadataHandler
16
15
 
17
16
 
@@ -43,7 +42,7 @@ class DownloadTelegram(DownloadBase):
43
42
  application = ( # type: ignore
44
43
  ApplicationBuilder()
45
44
  .token(self.token)
46
- .rate_limiter(AIORateLimiter())
45
+ .rate_limiter(AIORateLimiter(max_retries=3))
47
46
  .connect_timeout(timeout)
48
47
  .pool_timeout(timeout)
49
48
  .read_timeout(timeout)
@@ -124,7 +123,7 @@ class DownloadTelegram(DownloadBase):
124
123
  url: str,
125
124
  out_dir: Path,
126
125
  opt_cred: Optional[CredOption],
127
- cb: "Union[Queue[CbQueueItemType], Callback]",
126
+ cb: CallbackProtocol,
128
127
  cb_return: CallbackReturn,
129
128
  ) -> bool:
130
129
  downloader = DownloadTelegram(url, out_dir, opt_cred, cb, cb_return)
sticker_convert/gui.py CHANGED
@@ -125,6 +125,7 @@ class GUI(Window):
125
125
  self.duration_min_var = IntVar(self)
126
126
  self.duration_max_var = IntVar(self)
127
127
  self.duration_disable_var = BooleanVar()
128
+ self.padding_percent_var = IntVar(self)
128
129
  self.img_size_max_var = IntVar(self)
129
130
  self.vid_size_max_var = IntVar(self)
130
131
  self.size_disable_var = BooleanVar()
@@ -519,6 +520,7 @@ class GUI(Window):
519
520
  if not self.duration_disable_var.get()
520
521
  else None,
521
522
  bg_color=self.bg_color_var.get(),
523
+ padding_percent=self.padding_percent_var.get(),
522
524
  steps=self.steps_var.get(),
523
525
  fake_vid=self.fake_vid_var.get(),
524
526
  scale_filter=self.scale_filter_var.get(),
@@ -642,10 +644,10 @@ class GUI(Window):
642
644
 
643
645
  def cb_bar(
644
646
  self,
645
- *args: Any,
646
647
  set_progress_mode: Optional[str] = None,
647
648
  steps: int = 0,
648
649
  update_bar: int = 0,
650
+ *args: Any,
649
651
  **kwargs: Any,
650
652
  ) -> None:
651
653
  self.progress_frame.update_progress_bar(
@@ -227,6 +227,16 @@ class AdvancedCompressionWindow(BaseWindow):
227
227
  )
228
228
  self.color_power_entry.bind("<Button-3><ButtonRelease-3>", RightClicker)
229
229
 
230
+ self.padding_percent_help_btn = self.add_help_btn(
231
+ self.gui.help["comp"]["padding_percent"]
232
+ )
233
+ self.padding_percent_lbl1 = Label(self.frame_advcomp, text="Padding")
234
+ self.padding_percent_lbl2 = Label(self.frame_advcomp, text="0-100%")
235
+ self.padding_percent_entry = Entry(
236
+ self.frame_advcomp, textvariable=self.gui.padding_percent_var, width=8
237
+ )
238
+ self.padding_percent_entry.bind("<Button-3><ButtonRelease-3>", RightClicker)
239
+
230
240
  self.fake_vid_help_btn = self.add_help_btn(self.gui.help["comp"]["fake_vid"])
231
241
  self.fake_vid_lbl = Label(
232
242
  self.frame_advcomp, text="Convert (faking) image to video"
@@ -297,113 +307,119 @@ class AdvancedCompressionWindow(BaseWindow):
297
307
  self.ph_im = ImageTk.PhotoImage(self.im)
298
308
  self.default_emoji_dsp = Label(self.frame_advcomp, image=self.ph_im)
299
309
 
300
- self.fps_help_btn.grid(column=0, row=2, sticky="w", padx=3, pady=3)
301
- self.fps_lbl.grid(column=1, row=2, sticky="w", padx=3, pady=3)
302
- self.fps_min_lbl.grid(column=2, row=2, sticky="w", padx=3, pady=3)
303
- self.fps_min_entry.grid(column=3, row=2, sticky="nes", padx=3, pady=3)
304
- self.fps_max_lbl.grid(column=4, row=2, sticky="w", padx=3, pady=3)
305
- self.fps_max_entry.grid(column=5, row=2, sticky="nes", padx=3, pady=3)
306
- self.fps_disable_cbox.grid(column=6, row=2, sticky="nes", padx=3, pady=3)
307
-
308
- self.res_w_help_btn.grid(column=0, row=3, sticky="w", padx=3, pady=3)
309
- self.res_w_lbl.grid(column=1, row=3, sticky="w", padx=3, pady=3)
310
- self.res_w_min_lbl.grid(column=2, row=3, sticky="w", padx=3, pady=3)
311
- self.res_w_min_entry.grid(column=3, row=3, sticky="nes", padx=3, pady=3)
312
- self.res_w_max_lbl.grid(column=4, row=3, sticky="w", padx=3, pady=3)
313
- self.res_w_max_entry.grid(column=5, row=3, sticky="nes", padx=3, pady=3)
314
- self.res_w_disable_cbox.grid(column=6, row=3, sticky="nes", padx=3, pady=3)
315
-
316
- self.res_h_help_btn.grid(column=0, row=4, sticky="w", padx=3, pady=3)
317
- self.res_h_lbl.grid(column=1, row=4, sticky="w", padx=3, pady=3)
318
- self.res_h_min_lbl.grid(column=2, row=4, sticky="w", padx=3, pady=3)
319
- self.res_h_min_entry.grid(column=3, row=4, sticky="nes", padx=3, pady=3)
320
- self.res_h_max_lbl.grid(column=4, row=4, sticky="w", padx=3, pady=3)
321
- self.res_h_max_entry.grid(column=5, row=4, sticky="nes", padx=3, pady=3)
322
- self.res_h_disable_cbox.grid(column=6, row=4, sticky="nes", padx=3, pady=3)
323
-
324
- self.quality_help_btn.grid(column=0, row=5, sticky="w", padx=3, pady=3)
325
- self.quality_lbl.grid(column=1, row=5, sticky="w", padx=3, pady=3)
326
- self.quality_min_lbl.grid(column=2, row=5, sticky="w", padx=3, pady=3)
327
- self.quality_min_entry.grid(column=3, row=5, sticky="nes", padx=3, pady=3)
328
- self.quality_max_lbl.grid(column=4, row=5, sticky="w", padx=3, pady=3)
329
- self.quality_max_entry.grid(column=5, row=5, sticky="nes", padx=3, pady=3)
330
- self.quality_disable_cbox.grid(column=6, row=5, sticky="nes", padx=3, pady=3)
331
-
332
- self.color_help_btn.grid(column=0, row=6, sticky="w", padx=3, pady=3)
333
- self.color_lbl.grid(column=1, row=6, sticky="w", padx=3, pady=3)
334
- self.color_min_lbl.grid(column=2, row=6, sticky="w", padx=3, pady=3)
335
- self.color_min_entry.grid(column=3, row=6, sticky="nes", padx=3, pady=3)
336
- self.color_max_lbl.grid(column=4, row=6, sticky="w", padx=3, pady=3)
337
- self.color_max_entry.grid(column=5, row=6, sticky="nes", padx=3, pady=3)
338
- self.color_disable_cbox.grid(column=6, row=6, sticky="nes", padx=3, pady=3)
339
-
340
- self.duration_help_btn.grid(column=0, row=7, sticky="w", padx=3, pady=3)
341
- self.duration_lbl.grid(column=1, row=7, sticky="w", padx=3, pady=3)
342
- self.duration_min_lbl.grid(column=2, row=7, sticky="w", padx=3, pady=3)
343
- self.duration_min_entry.grid(column=3, row=7, sticky="nes", padx=3, pady=3)
344
- self.duration_max_lbl.grid(column=4, row=7, sticky="w", padx=3, pady=3)
345
- self.duration_max_entry.grid(column=5, row=7, sticky="nes", padx=3, pady=3)
346
- self.duration_disable_cbox.grid(column=6, row=7, sticky="nes", padx=3, pady=3)
347
-
348
- self.size_help_btn.grid(column=0, row=8, sticky="w", padx=3, pady=3)
349
- self.size_lbl.grid(column=1, row=8, sticky="w", padx=3, pady=3)
350
- self.img_size_max_lbl.grid(column=2, row=8, sticky="w", padx=3, pady=3)
351
- self.img_size_max_entry.grid(column=3, row=8, sticky="nes", padx=3, pady=3)
352
- self.vid_size_max_lbl.grid(column=4, row=8, sticky="w", padx=3, pady=3)
353
- self.vid_size_max_entry.grid(column=5, row=8, sticky="nes", padx=3, pady=3)
354
- self.size_disable_cbox.grid(column=6, row=8, sticky="nes", padx=3, pady=3)
355
-
356
- self.format_help_btn.grid(column=0, row=9, sticky="w", padx=3, pady=3)
357
- self.format_lbl.grid(column=1, row=9, sticky="w", padx=3, pady=3)
358
- self.img_format_lbl.grid(column=2, row=9, sticky="w", padx=3, pady=3)
359
- self.img_format_entry.grid(column=3, row=9, sticky="nes", padx=3, pady=3)
360
- self.vid_format_lbl.grid(column=4, row=9, sticky="w", padx=3, pady=3)
361
- self.vid_format_entry.grid(column=5, row=9, sticky="nes", padx=3, pady=3)
362
-
363
- self.power_help_btn1.grid(column=0, row=10, sticky="w", padx=3, pady=3)
364
- self.power_lbl1.grid(column=1, row=10, sticky="w", padx=3, pady=3)
365
- self.fps_power_lbl.grid(column=2, row=10, sticky="w", padx=3, pady=3)
366
- self.fps_power_entry.grid(column=3, row=10, sticky="w", padx=3, pady=3)
367
- self.res_power_lbl.grid(column=4, row=10, sticky="w", padx=3, pady=3)
368
- self.res_power_entry.grid(column=5, row=10, sticky="w", padx=3, pady=3)
369
-
370
- self.power_help_btn2.grid(column=0, row=11, sticky="w", padx=3, pady=3)
371
- self.power_lbl2.grid(column=1, row=11, sticky="w", padx=3, pady=3)
372
- self.quality_power_lbl.grid(column=2, row=11, sticky="w", padx=3, pady=3)
373
- self.quality_power_entry.grid(column=3, row=11, sticky="w", padx=3, pady=3)
374
- self.color_power_lbl.grid(column=4, row=11, sticky="w", padx=3, pady=3)
375
- self.color_power_entry.grid(column=5, row=11, sticky="w", padx=3, pady=3)
376
-
377
- self.fake_vid_help_btn.grid(column=0, row=12, sticky="w", padx=3, pady=3)
378
- self.fake_vid_lbl.grid(column=1, row=12, sticky="w", padx=3, pady=3)
379
- self.fake_vid_cbox.grid(column=6, row=12, sticky="nes", padx=3, pady=3)
380
-
381
- self.bg_color_help_btn.grid(column=0, row=13, sticky="w", padx=3, pady=3)
382
- self.bg_color_lbl.grid(column=1, row=13, sticky="w", padx=3, pady=3)
383
- self.bg_color_entry.grid(column=5, row=13, sticky="w", padx=3, pady=3)
384
- self.bg_color_btn.grid(column=6, row=13, sticky="nes", padx=3, pady=3)
385
-
386
- self.scale_filter_help_btn.grid(column=0, row=14, sticky="w", padx=3, pady=3)
387
- self.scale_filter_lbl.grid(column=1, row=14, sticky="w", padx=3, pady=3)
310
+ r = 0
311
+ self.fps_help_btn.grid(column=0, row=r, sticky="w", padx=3, pady=3)
312
+ self.fps_lbl.grid(column=1, row=r, sticky="w", padx=3, pady=3)
313
+ self.fps_min_lbl.grid(column=2, row=r, sticky="w", padx=3, pady=3)
314
+ self.fps_min_entry.grid(column=3, row=r, sticky="nes", padx=3, pady=3)
315
+ self.fps_max_lbl.grid(column=4, row=r, sticky="w", padx=3, pady=3)
316
+ self.fps_max_entry.grid(column=5, row=r, sticky="nes", padx=3, pady=3)
317
+ self.fps_disable_cbox.grid(column=6, row=r, sticky="nes", padx=3, pady=3)
318
+ r += 1
319
+ self.res_w_help_btn.grid(column=0, row=r, sticky="w", padx=3, pady=3)
320
+ self.res_w_lbl.grid(column=1, row=r, sticky="w", padx=3, pady=3)
321
+ self.res_w_min_lbl.grid(column=2, row=r, sticky="w", padx=3, pady=3)
322
+ self.res_w_min_entry.grid(column=3, row=r, sticky="nes", padx=3, pady=3)
323
+ self.res_w_max_lbl.grid(column=4, row=r, sticky="w", padx=3, pady=3)
324
+ self.res_w_max_entry.grid(column=5, row=r, sticky="nes", padx=3, pady=3)
325
+ self.res_w_disable_cbox.grid(column=6, row=r, sticky="nes", padx=3, pady=3)
326
+ r += 1
327
+ self.res_h_help_btn.grid(column=0, row=r, sticky="w", padx=3, pady=3)
328
+ self.res_h_lbl.grid(column=1, row=r, sticky="w", padx=3, pady=3)
329
+ self.res_h_min_lbl.grid(column=2, row=r, sticky="w", padx=3, pady=3)
330
+ self.res_h_min_entry.grid(column=3, row=r, sticky="nes", padx=3, pady=3)
331
+ self.res_h_max_lbl.grid(column=4, row=r, sticky="w", padx=3, pady=3)
332
+ self.res_h_max_entry.grid(column=5, row=r, sticky="nes", padx=3, pady=3)
333
+ self.res_h_disable_cbox.grid(column=6, row=r, sticky="nes", padx=3, pady=3)
334
+ r += 1
335
+ self.quality_help_btn.grid(column=0, row=r, sticky="w", padx=3, pady=3)
336
+ self.quality_lbl.grid(column=1, row=r, sticky="w", padx=3, pady=3)
337
+ self.quality_min_lbl.grid(column=2, row=r, sticky="w", padx=3, pady=3)
338
+ self.quality_min_entry.grid(column=3, row=r, sticky="nes", padx=3, pady=3)
339
+ self.quality_max_lbl.grid(column=4, row=r, sticky="w", padx=3, pady=3)
340
+ self.quality_max_entry.grid(column=5, row=r, sticky="nes", padx=3, pady=3)
341
+ self.quality_disable_cbox.grid(column=6, row=r, sticky="nes", padx=3, pady=3)
342
+ r += 1
343
+ self.color_help_btn.grid(column=0, row=r, sticky="w", padx=3, pady=3)
344
+ self.color_lbl.grid(column=1, row=r, sticky="w", padx=3, pady=3)
345
+ self.color_min_lbl.grid(column=2, row=r, sticky="w", padx=3, pady=3)
346
+ self.color_min_entry.grid(column=3, row=r, sticky="nes", padx=3, pady=3)
347
+ self.color_max_lbl.grid(column=4, row=r, sticky="w", padx=3, pady=3)
348
+ self.color_max_entry.grid(column=5, row=r, sticky="nes", padx=3, pady=3)
349
+ self.color_disable_cbox.grid(column=6, row=r, sticky="nes", padx=3, pady=3)
350
+ r += 1
351
+ self.duration_help_btn.grid(column=0, row=r, sticky="w", padx=3, pady=3)
352
+ self.duration_lbl.grid(column=1, row=r, sticky="w", padx=3, pady=3)
353
+ self.duration_min_lbl.grid(column=2, row=r, sticky="w", padx=3, pady=3)
354
+ self.duration_min_entry.grid(column=3, row=r, sticky="nes", padx=3, pady=3)
355
+ self.duration_max_lbl.grid(column=4, row=r, sticky="w", padx=3, pady=3)
356
+ self.duration_max_entry.grid(column=5, row=r, sticky="nes", padx=3, pady=3)
357
+ self.duration_disable_cbox.grid(column=6, row=r, sticky="nes", padx=3, pady=3)
358
+ r += 1
359
+ self.size_help_btn.grid(column=0, row=r, sticky="w", padx=3, pady=3)
360
+ self.size_lbl.grid(column=1, row=r, sticky="w", padx=3, pady=3)
361
+ self.img_size_max_lbl.grid(column=2, row=r, sticky="w", padx=3, pady=3)
362
+ self.img_size_max_entry.grid(column=3, row=r, sticky="nes", padx=3, pady=3)
363
+ self.vid_size_max_lbl.grid(column=4, row=r, sticky="w", padx=3, pady=3)
364
+ self.vid_size_max_entry.grid(column=5, row=r, sticky="nes", padx=3, pady=3)
365
+ self.size_disable_cbox.grid(column=6, row=r, sticky="nes", padx=3, pady=3)
366
+ r += 1
367
+ self.format_help_btn.grid(column=0, row=r, sticky="w", padx=3, pady=3)
368
+ self.format_lbl.grid(column=1, row=r, sticky="w", padx=3, pady=3)
369
+ self.img_format_lbl.grid(column=2, row=r, sticky="w", padx=3, pady=3)
370
+ self.img_format_entry.grid(column=3, row=r, sticky="nes", padx=3, pady=3)
371
+ self.vid_format_lbl.grid(column=4, row=r, sticky="w", padx=3, pady=3)
372
+ self.vid_format_entry.grid(column=5, row=r, sticky="nes", padx=3, pady=3)
373
+ r += 1
374
+ self.power_help_btn1.grid(column=0, row=r, sticky="w", padx=3, pady=3)
375
+ self.power_lbl1.grid(column=1, row=r, sticky="w", padx=3, pady=3)
376
+ self.fps_power_lbl.grid(column=2, row=r, sticky="w", padx=3, pady=3)
377
+ self.fps_power_entry.grid(column=3, row=r, sticky="w", padx=3, pady=3)
378
+ self.res_power_lbl.grid(column=4, row=r, sticky="w", padx=3, pady=3)
379
+ self.res_power_entry.grid(column=5, row=r, sticky="w", padx=3, pady=3)
380
+ r += 1
381
+ self.power_help_btn2.grid(column=0, row=r, sticky="w", padx=3, pady=3)
382
+ self.power_lbl2.grid(column=1, row=r, sticky="w", padx=3, pady=3)
383
+ self.quality_power_lbl.grid(column=2, row=r, sticky="w", padx=3, pady=3)
384
+ self.quality_power_entry.grid(column=3, row=r, sticky="w", padx=3, pady=3)
385
+ self.color_power_lbl.grid(column=4, row=r, sticky="w", padx=3, pady=3)
386
+ self.color_power_entry.grid(column=5, row=r, sticky="w", padx=3, pady=3)
387
+ r += 1
388
+ self.padding_percent_help_btn.grid(column=0, row=r, sticky="w", padx=3, pady=3)
389
+ self.padding_percent_lbl1.grid(column=1, row=r, sticky="w", padx=3, pady=3)
390
+ self.padding_percent_lbl2.grid(column=2, row=r, sticky="w", padx=3, pady=3)
391
+ self.padding_percent_entry.grid(column=3, row=r, sticky="w", padx=3, pady=3)
392
+ r += 1
393
+ self.fake_vid_help_btn.grid(column=0, row=r, sticky="w", padx=3, pady=3)
394
+ self.fake_vid_lbl.grid(column=1, row=r, sticky="w", padx=3, pady=3)
395
+ self.fake_vid_cbox.grid(column=6, row=r, sticky="nes", padx=3, pady=3)
396
+ r += 1
397
+ self.bg_color_help_btn.grid(column=0, row=r, sticky="w", padx=3, pady=3)
398
+ self.bg_color_lbl.grid(column=1, row=r, sticky="w", padx=3, pady=3)
399
+ self.bg_color_entry.grid(column=5, row=r, sticky="w", padx=3, pady=3)
400
+ self.bg_color_btn.grid(column=6, row=r, sticky="nes", padx=3, pady=3)
401
+ r += 1
402
+ self.scale_filter_help_btn.grid(column=0, row=r, sticky="w", padx=3, pady=3)
403
+ self.scale_filter_lbl.grid(column=1, row=r, sticky="w", padx=3, pady=3)
388
404
  self.scale_filter_opt.grid(
389
- column=2, row=14, columnspan=4, sticky="nes", padx=3, pady=3
405
+ column=2, row=r, columnspan=4, sticky="nes", padx=3, pady=3
390
406
  )
391
-
392
- self.quantize_method_help_btn.grid(column=0, row=15, sticky="w", padx=3, pady=3)
393
- self.quantize_method_lbl.grid(column=1, row=15, sticky="w", padx=3, pady=3)
407
+ r += 1
408
+ self.quantize_method_help_btn.grid(column=0, row=r, sticky="w", padx=3, pady=3)
409
+ self.quantize_method_lbl.grid(column=1, row=r, sticky="w", padx=3, pady=3)
394
410
  self.quantize_method_opt.grid(
395
- column=2, row=15, columnspan=4, sticky="nes", padx=3, pady=3
411
+ column=2, row=r, columnspan=4, sticky="nes", padx=3, pady=3
396
412
  )
397
-
398
- self.cache_dir_help_btn.grid(column=0, row=16, sticky="w", padx=3, pady=3)
399
- self.cache_dir_lbl.grid(column=1, row=16, sticky="w", padx=3, pady=3)
413
+ r += 1
414
+ self.cache_dir_help_btn.grid(column=0, row=r, sticky="w", padx=3, pady=3)
415
+ self.cache_dir_lbl.grid(column=1, row=r, sticky="w", padx=3, pady=3)
400
416
  self.cache_dir_entry.grid(
401
- column=2, row=16, columnspan=4, sticky="nes", padx=3, pady=3
417
+ column=2, row=r, columnspan=4, sticky="nes", padx=3, pady=3
402
418
  )
403
-
404
- self.default_emoji_help_btn.grid(column=0, row=17, sticky="w", padx=3, pady=3)
405
- self.default_emoji_lbl.grid(column=1, row=17, sticky="w", padx=3, pady=3)
406
- self.default_emoji_dsp.grid(column=6, row=17, sticky="nes", padx=3, pady=3)
419
+ r += 1
420
+ self.default_emoji_help_btn.grid(column=0, row=r, sticky="w", padx=3, pady=3)
421
+ self.default_emoji_lbl.grid(column=1, row=r, sticky="w", padx=3, pady=3)
422
+ self.default_emoji_dsp.grid(column=6, row=r, sticky="nes", padx=3, pady=3)
407
423
 
408
424
  # https://stackoverflow.com/questions/43731784/tkinter-canvas-scrollbar-with-grid
409
425
  # Create a frame for the canvas with non-zero row&column weights