Skip to content

Commit 1d19665

Browse files
committed
Maintenance is coming
1 parent 1a371e4 commit 1d19665

File tree

4 files changed

+333
-296
lines changed

4 files changed

+333
-296
lines changed

Averager.py

Lines changed: 24 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
__copyright__ = '(c) 2024-2025 Ilya Razmanov'
3939
__credits__ = 'Ilya Razmanov'
4040
__license__ = 'unlicense'
41-
__version__ = '3.20.20.3'
41+
__version__ = '3.21.2.11'
4242
__maintainer__ = 'Ilya Razmanov'
4343
__email__ = 'ilyarazmanov@gmail.com'
4444
__status__ = 'Production'
@@ -96,6 +96,7 @@ def UINormal() -> None:
9696
info_string.config(text=info_normal['txt'], foreground=info_normal['fg'], background=info_normal['bg'])
9797
if Z == 1 or Z == 3:
9898
check02['state'] = 'disabled'
99+
sortir.update()
99100

100101

101102
def UIBusy() -> None:
@@ -118,14 +119,10 @@ def ShowPreview(preview_name: PhotoImage, caption: str) -> None:
118119
preview = preview_name
119120

120121
if zoom_factor > 0:
121-
preview = preview.zoom(
122-
zoom_factor + 1,
123-
)
122+
preview = preview.zoom(zoom_factor + 1)
124123
label_zoom['text'] = f'Zoom {zoom_factor + 1}:1'
125124
elif zoom_factor < 0:
126-
preview = preview.subsample(
127-
1 - zoom_factor,
128-
)
125+
preview = preview.subsample(1 - zoom_factor)
129126
label_zoom['text'] = f'Zoom 1:{1 - zoom_factor}'
130127
else:
131128
preview = preview_name
@@ -216,19 +213,20 @@ def GetSource(event=None) -> None:
216213
butt_minus.config(state='normal', cursor='hand2')
217214
# ↓ Adding filename, mode and status to window title a-la Photoshop
218215
if Z == 1:
219-
color_mode_str = ' (L)'
216+
color_mode_str = f' (L:{"8" if maxcolors < 256 else "16"})'
220217
elif Z == 2:
221-
color_mode_str = ' (LA)'
218+
color_mode_str = f' (LA:{"8" if maxcolors < 256 else "16"})'
222219
elif Z == 3:
223-
color_mode_str = ' (RGB)'
220+
color_mode_str = f' (RGB:{"8" if maxcolors < 256 else "16"})'
224221
elif Z == 4:
225-
color_mode_str = ' (RGBA)'
222+
color_mode_str = f' (RGBA:{"8" if maxcolors < 256 else "16"})'
226223
else:
227224
color_mode_str = '' # Just in case
228225
sortir.title(f'Averager: {Path(sourcefilename).name}{color_mode_str}{"*" if is_filtered else ""}')
229226
info_normal = {'txt': f'{Path(sourcefilename).name}{"*" if is_filtered else ""} X={X} Y={Y} Z={Z} maxcolors={maxcolors}', 'fg': 'grey', 'bg': 'grey90'}
230227
# ↓ enabling "Filter"
231228
UINormal()
229+
sortir.geometry(f'+{(sortir.winfo_screenwidth() - sortir.winfo_width()) // 2}+{(sortir.winfo_screenheight() - sortir.winfo_height()) // 2 - 32}')
232230
butt02.focus_set() # moving focus to "Filter"
233231

234232

@@ -383,7 +381,7 @@ def SaveAs(event=None) -> None:
383381
format_list = [('Portable network graphics', '.png'), ('Portable grey map', '.pgm')]
384382
proposed_name = Path(sourcefilename).stem + '.png'
385383
elif Z == 2:
386-
format_list = [('Portable network graphics', '.png'), ('Portable grey map', '.pgm')]
384+
format_list = [('Portable network graphics', '.png')]
387385
proposed_name = Path(sourcefilename).stem + '.png'
388386
elif Z == 3:
389387
if src_extension == '.ppm':
@@ -393,7 +391,7 @@ def SaveAs(event=None) -> None:
393391
format_list = [('Portable network graphics', '.png'), ('Portable pixel map', '.ppm')]
394392
proposed_name = Path(sourcefilename).stem + '.png'
395393
else:
396-
format_list = [('Portable network graphics', '.png'), ('Portable pixel map', '.ppm')]
394+
format_list = [('Portable network graphics', '.png')]
397395
proposed_name = Path(sourcefilename).stem + '.png'
398396

399397
# ↓ Open export file
@@ -438,7 +436,8 @@ def SaveAs(event=None) -> None:
438436

439437
sortir.iconphoto(True, PhotoImage(data='P6\n2 8\n255\n'.encode(encoding='ascii') + randbytes(2 * 8 * 3)))
440438
sortir.title('Averager')
441-
sortir.minsize(360, 100)
439+
sortir.minsize(320, 240)
440+
sortir.maxsize(9 * sortir.winfo_screenwidth() // 10, 9 * sortir.winfo_screenheight() // 10)
442441

443442
# ↓ Info statuses dictionaries
444443
info_normal = {'txt': f'Adaptive Average {__version__}', 'fg': 'grey', 'bg': 'grey90'}
@@ -455,16 +454,16 @@ def SaveAs(event=None) -> None:
455454
sortir.bind_all('<Control-q>', DisMiss)
456455

457456
frame_top = Frame(sortir, borderwidth=2, relief='groove')
458-
frame_top.pack(side='top', anchor='nw', pady=(0, 2))
457+
frame_top.pack(side='top', anchor='n', pady=(0, 2))
459458
frame_preview = Frame(sortir, borderwidth=2, relief='groove')
460-
frame_preview.pack(side='top')
459+
frame_preview.pack(side='top', anchor='center', expand=True)
461460

462461
""" ┌──────────────────────┐
463462
│ Top frame (controls) │
464463
└─────────────────────-┘ """
465464

466465
# ↓ File menu
467-
butt01 = Menubutton(frame_top, text='File...'.ljust(10, ' '), font=('helvetica', 12), cursor='hand2', justify='left', state='normal', indicatoron=False, relief='raised', borderwidth=2, background='grey90', activebackground='grey98')
466+
butt01 = Menubutton(frame_top, text='File...'.ljust(10, ' '), font=('helvetica', 12), cursor='hand2', state='normal', indicatoron=False, relief='raised', borderwidth=2, background='grey90', activebackground='grey98')
468467
butt01.grid(row=0, column=0, rowspan=2, sticky='ns', padx=(0, 10), pady=0)
469468

470469
menu02 = Menu(butt01, tearoff=False) # "File" menu
@@ -485,15 +484,15 @@ def SaveAs(event=None) -> None:
485484
info00.grid(row=0, column=1)
486485

487486
# ↓ X-pass threshold control
488-
info01 = Label(frame_top, text='X:', font=('helvetica', 11), justify='left', state='disabled')
487+
info01 = Label(frame_top, text='X:', font=('helvetica', 11), state='disabled')
489488
info01.grid(row=0, column=2)
490489

491490
ini_threshold_x = IntVar(value=16)
492491
spin01 = Spinbox(frame_top, from_=0, to=256, increment=1, textvariable=ini_threshold_x, state='disabled', width=3, font=('helvetica', 11))
493492
spin01.grid(row=0, column=3)
494493

495494
# ↓ Y-pass threshold control
496-
info02 = Label(frame_top, text='Y:', font=('helvetica', 11), justify='left', state='disabled')
495+
info02 = Label(frame_top, text='Y:', font=('helvetica', 11), state='disabled')
497496
info02.grid(row=0, column=4)
498497

499498
ini_threshold_y = IntVar(value=8)
@@ -502,16 +501,16 @@ def SaveAs(event=None) -> None:
502501

503502
# ↓ Wrap around control
504503
ini_wraparound = BooleanVar(value=False)
505-
check01 = Checkbutton(frame_top, text='Wrap around', font=('helvetica', 9), justify='left', variable=ini_wraparound, onvalue=True, offvalue=False, state='disabled')
504+
check01 = Checkbutton(frame_top, text='Wrap around', font=('helvetica', 9), variable=ini_wraparound, onvalue=True, offvalue=False, state='disabled')
506505
check01.grid(row=1, column=1, sticky='ws')
507506

508507
# ↓ Keep alpha control
509508
ini_keep_alpha = BooleanVar(value=False)
510-
check02 = Checkbutton(frame_top, text='Keep alpha', font=('helvetica', 9), justify='left', variable=ini_keep_alpha, onvalue=True, offvalue=False, state='disabled')
509+
check02 = Checkbutton(frame_top, text='Keep alpha', font=('helvetica', 9), variable=ini_keep_alpha, onvalue=True, offvalue=False, state='disabled')
511510
check02.grid(row=1, column=3, columnspan=3, sticky='ws')
512511

513512
# ↓ Filter start
514-
butt02 = Button(frame_top, text='Filter'.center(10, ' '), font=('helvetica', 12), cursor='arrow', justify='center', state='disabled', relief='raised', borderwidth=2, background='grey90', activebackground='grey98', command=RunFilter)
513+
butt02 = Button(frame_top, text='Filter'.center(10, ' '), font=('helvetica', 12), cursor='arrow', state='disabled', relief='raised', borderwidth=2, background='grey90', activebackground='grey98', command=RunFilter)
515514
butt02.grid(row=0, column=6, rowspan=2, sticky='nsew', padx=(10, 0), pady=0)
516515

517516
""" ┌──────────────────────────────┐
@@ -532,13 +531,13 @@ def SaveAs(event=None) -> None:
532531
frame_preview.bind('<Double-Button-1>', GetSource)
533532
zanyato.pack(side='top')
534533

535-
frame_zoom = Frame(frame_preview, width=300, borderwidth=2, relief='groove')
534+
frame_zoom = Frame(frame_preview, borderwidth=2, relief='groove')
536535
frame_zoom.pack(side='bottom')
537536

538-
butt_plus = Button(frame_zoom, text='+', font=('courier', 8), width=2, cursor='arrow', justify='center', state='disabled', borderwidth=1, command=zoomIn)
537+
butt_plus = Button(frame_zoom, text='+', font=('courier', 8), width=2, cursor='arrow', state='disabled', borderwidth=1, command=zoomIn)
539538
butt_plus.pack(side='left', padx=0, pady=0, fill='both')
540539

541-
butt_minus = Button(frame_zoom, text='-', font=('courier', 8), width=2, cursor='arrow', justify='center', state='disabled', borderwidth=1, command=zoomOut)
540+
butt_minus = Button(frame_zoom, text='-', font=('courier', 8), width=2, cursor='arrow', state='disabled', borderwidth=1, command=zoomOut)
542541
butt_minus.pack(side='right', padx=0, pady=0, fill='both')
543542

544543
label_zoom = Label(frame_zoom, text='Zoom 1:1', font=('courier', 8), state='disabled')

POVRayThread.py

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
__copyright__ = '(c) 2024-2025 Ilya Razmanov'
3838
__credits__ = 'Ilya Razmanov'
3939
__license__ = 'unlicense'
40-
__version__ = '1.20.20.1'
40+
__version__ = '1.21.2.11'
4141
__maintainer__ = 'Ilya Razmanov'
4242
__email__ = 'ilyarazmanov@gmail.com'
4343
__status__ = 'Production'
@@ -94,6 +94,7 @@ def UINormal() -> None:
9494
if widget.winfo_class() == 'Button':
9595
widget['cursor'] = 'hand2'
9696
info_string.config(text=info_normal['txt'], foreground=info_normal['fg'], background=info_normal['bg'])
97+
sortir.update()
9798

9899

99100
def UIBusy() -> None:
@@ -212,6 +213,7 @@ def GetSource(event=None) -> None:
212213
info_normal = {'txt': f'{Path(sourcefilename).name} X={X} Y={Y} Z={Z} maxcolors={maxcolors}', 'fg': 'grey', 'bg': 'grey90'}
213214
# ↓ enabling "Filter"
214215
UINormal()
216+
sortir.geometry(f'+{(sortir.winfo_screenwidth() - sortir.winfo_width()) // 2}+{(sortir.winfo_screenheight() - sortir.winfo_height()) // 2 - 32}')
215217
butt02.focus_set() # moving focus to "Filter"
216218

217219

@@ -373,7 +375,7 @@ def SaveAsStitch() -> None:
373375

374376
sortir.iconphoto(True, PhotoImage(data='P6\n2 8\n255\n'.encode(encoding='ascii') + randbytes(2 * 8 * 3)))
375377
sortir.title('POV-Ray Thread')
376-
sortir.minsize(300, 100)
378+
sortir.minsize(320, 240)
377379

378380
# ↓ Info statuses dictionaries
379381
info_normal = {'txt': f'POV-Ray Thread {__version__}', 'fg': 'grey', 'bg': 'grey90'}
@@ -389,16 +391,16 @@ def SaveAsStitch() -> None:
389391
sortir.bind_all('<Control-q>', DisMiss)
390392

391393
frame_top = Frame(sortir, borderwidth=2, relief='groove')
392-
frame_top.pack(side='top', anchor='nw', pady=(0, 2))
394+
frame_top.pack(side='top', anchor='n', pady=(0, 2))
393395
frame_preview = Frame(sortir, borderwidth=2, relief='groove')
394-
frame_preview.pack(side='top')
396+
frame_preview.pack(side='top', anchor='center', expand=True)
395397

396398
""" ┌──────────────────────┐
397399
│ Top frame (controls) │
398400
└─────────────────────-┘ """
399401

400402
# ↓ File and menu
401-
butt01 = Menubutton(frame_top, text='File...'.ljust(10, ' '), font=('helvetica', 12), cursor='hand2', justify='left', state='normal', indicatoron=False, relief='raised', borderwidth=2, background='grey90', activebackground='grey98')
403+
butt01 = Menubutton(frame_top, text='File...'.ljust(10, ' '), font=('helvetica', 12), cursor='hand2', state='normal', indicatoron=False, relief='raised', borderwidth=2, background='grey90', activebackground='grey98')
402404
butt01.pack(side='left', padx=(0, 10), pady=0, fill='x')
403405

404406
menu02 = Menu(butt01, tearoff=False) # "File" menu
@@ -419,23 +421,23 @@ def SaveAsStitch() -> None:
419421
info00.pack(side='left', padx=(0, 4), pady=0, fill='x')
420422

421423
# ↓ X-pass threshold control
422-
info01 = Label(frame_top, text='X:', font=('helvetica', 10), justify='left', state='disabled')
424+
info01 = Label(frame_top, text='X:', font=('helvetica', 10), state='disabled')
423425
info01.pack(side='left', padx=0, pady=0, fill='x')
424426

425427
ini_threshold_x = IntVar(value=16)
426428
spin01 = Spinbox(frame_top, from_=0, to=256, increment=1, textvariable=ini_threshold_x, state='disabled', width=3, font=('helvetica', 11))
427429
spin01.pack(side='left', padx=(0, 4), pady=0, fill='x')
428430

429431
# ↓ Y-pass threshold control
430-
info02 = Label(frame_top, text='Y:', font=('helvetica', 10), justify='left', state='disabled')
432+
info02 = Label(frame_top, text='Y:', font=('helvetica', 10), state='disabled')
431433
info02.pack(side='left', padx=0, pady=0, fill='both')
432434

433435
ini_threshold_y = IntVar(value=8)
434436
spin02 = Spinbox(frame_top, from_=0, to=256, increment=1, textvariable=ini_threshold_y, state='disabled', width=3, font=('helvetica', 11))
435437
spin02.pack(side='left', padx=(0, 4), pady=0, fill='x')
436438

437439
# ↓ Filter start
438-
butt02 = Button(frame_top, text='Filter', font=('helvetica', 12), cursor='arrow', justify='center', state='disabled', relief='raised', borderwidth=2, background='grey90', activebackground='grey98', command=RunFilter)
440+
butt02 = Button(frame_top, text='Filter', font=('helvetica', 12), cursor='arrow', state='disabled', relief='raised', borderwidth=2, background='grey90', activebackground='grey98', command=RunFilter)
439441
butt02.pack(side='left', padx=0, pady=0, fill='both')
440442

441443
""" ┌──────────────────────────────┐
@@ -459,10 +461,10 @@ def SaveAsStitch() -> None:
459461
frame_zoom = Frame(frame_preview, width=300, borderwidth=2, relief='groove')
460462
frame_zoom.pack(side='bottom')
461463

462-
butt_plus = Button(frame_zoom, text='+', font=('courier', 8), width=2, cursor='arrow', justify='center', state='disabled', borderwidth=1, command=zoomIn)
464+
butt_plus = Button(frame_zoom, text='+', font=('courier', 8), width=2, cursor='arrow', state='disabled', borderwidth=1, command=zoomIn)
463465
butt_plus.pack(side='left', padx=0, pady=0, fill='both')
464466

465-
butt_minus = Button(frame_zoom, text='-', font=('courier', 8), width=2, cursor='arrow', justify='center', state='disabled', borderwidth=1, command=zoomOut)
467+
butt_minus = Button(frame_zoom, text='-', font=('courier', 8), width=2, cursor='arrow', state='disabled', borderwidth=1, command=zoomOut)
466468
butt_minus.pack(side='right', padx=0, pady=0, fill='both')
467469

468470
label_zoom = Label(frame_zoom, text='Zoom 1:1', font=('courier', 8), state='disabled')

pypnm/__init__.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,9 @@
1-
"""PNM (PPM and PGM) image files I/O for Python >= 3.4, 9 May 2025 "Victory" build. Type `from pypnm import pnmlpnm` to get access to functions."""
1+
"""PNM (PPM and PGM) image files reading, displaying and writing for Python > 3.10.
2+
----
3+
4+
2 Sep 2025 "Victory II" build. Fully interchangeable with previous
5+
9 May 2025 PyPNM 1.17.9.2 "Victory" build.
6+
7+
Use `from pypnm import pnmlpnm` to access functions.
8+
9+
PyPNM Documentation: https://dnyarri.github.io/pypnm/pypnm.pdf"""

0 commit comments

Comments
 (0)