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

Sign up to get free protection for your applications and to get access to all the features.
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