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.
- sticker_convert/cli.py +4 -0
- sticker_convert/converter.py +8 -8
- sticker_convert/downloaders/download_base.py +3 -7
- sticker_convert/downloaders/download_kakao.py +3 -4
- sticker_convert/downloaders/download_line.py +3 -4
- sticker_convert/downloaders/download_signal.py +3 -4
- sticker_convert/downloaders/download_telegram.py +3 -4
- sticker_convert/gui.py +3 -1
- sticker_convert/gui_components/windows/advanced_compression_window.py +117 -101
- sticker_convert/job.py +81 -89
- sticker_convert/job_option.py +3 -0
- sticker_convert/resources/compression.json +11 -0
- sticker_convert/resources/help.json +1 -0
- sticker_convert/uploaders/compress_wastickers.py +3 -4
- sticker_convert/uploaders/upload_base.py +2 -8
- sticker_convert/uploaders/upload_signal.py +3 -4
- sticker_convert/uploaders/upload_telegram.py +3 -4
- sticker_convert/uploaders/xcode_imessage.py +3 -4
- sticker_convert/utils/callback.py +33 -21
- sticker_convert/utils/media/codec_info.py +3 -7
- sticker_convert/version.py +1 -1
- {sticker_convert-2.8.0.dist-info → sticker_convert-2.8.2.dist-info}/METADATA +18 -15
- {sticker_convert-2.8.0.dist-info → sticker_convert-2.8.2.dist-info}/RECORD +27 -27
- {sticker_convert-2.8.0.dist-info → sticker_convert-2.8.2.dist-info}/LICENSE +0 -0
- {sticker_convert-2.8.0.dist-info → sticker_convert-2.8.2.dist-info}/WHEEL +0 -0
- {sticker_convert-2.8.0.dist-info → sticker_convert-2.8.2.dist-info}/entry_points.txt +0 -0
- {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,
|
sticker_convert/converter.py
CHANGED
@@ -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
|
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:
|
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:
|
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
|
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
|
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:
|
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
|
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
|
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:
|
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
|
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
|
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:
|
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
|
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
|
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:
|
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
|
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:
|
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
|
-
|
301
|
-
self.
|
302
|
-
self.
|
303
|
-
self.
|
304
|
-
self.
|
305
|
-
self.
|
306
|
-
self.
|
307
|
-
|
308
|
-
|
309
|
-
self.
|
310
|
-
self.
|
311
|
-
self.
|
312
|
-
self.
|
313
|
-
self.
|
314
|
-
self.
|
315
|
-
|
316
|
-
|
317
|
-
self.
|
318
|
-
self.
|
319
|
-
self.
|
320
|
-
self.
|
321
|
-
self.
|
322
|
-
self.
|
323
|
-
|
324
|
-
|
325
|
-
self.
|
326
|
-
self.
|
327
|
-
self.
|
328
|
-
self.
|
329
|
-
self.
|
330
|
-
self.
|
331
|
-
|
332
|
-
|
333
|
-
self.
|
334
|
-
self.
|
335
|
-
self.
|
336
|
-
self.
|
337
|
-
self.
|
338
|
-
self.
|
339
|
-
|
340
|
-
|
341
|
-
self.
|
342
|
-
self.
|
343
|
-
self.
|
344
|
-
self.
|
345
|
-
self.
|
346
|
-
self.
|
347
|
-
|
348
|
-
|
349
|
-
self.
|
350
|
-
self.
|
351
|
-
self.
|
352
|
-
self.
|
353
|
-
self.
|
354
|
-
self.
|
355
|
-
|
356
|
-
|
357
|
-
self.
|
358
|
-
self.
|
359
|
-
self.
|
360
|
-
self.
|
361
|
-
self.
|
362
|
-
|
363
|
-
|
364
|
-
self.
|
365
|
-
self.
|
366
|
-
self.
|
367
|
-
self.
|
368
|
-
self.
|
369
|
-
|
370
|
-
|
371
|
-
self.
|
372
|
-
self.
|
373
|
-
self.
|
374
|
-
self.
|
375
|
-
self.
|
376
|
-
|
377
|
-
|
378
|
-
self.
|
379
|
-
self.
|
380
|
-
|
381
|
-
self.
|
382
|
-
|
383
|
-
self.
|
384
|
-
self.
|
385
|
-
|
386
|
-
|
387
|
-
self.
|
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=
|
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=
|
393
|
-
self.quantize_method_lbl.grid(column=1, row=
|
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=
|
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=
|
399
|
-
self.cache_dir_lbl.grid(column=1, row=
|
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=
|
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=
|
405
|
-
self.default_emoji_lbl.grid(column=1, row=
|
406
|
-
self.default_emoji_dsp.grid(column=6, row=
|
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
|