Pysimplegui: [์งˆ๋ฌธ] * MAC USERS * no_titlebar๊ฐ€ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

์— ๋งŒ๋“  2020๋…„ 10์›” 28์ผ  ยท  30์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: PySimpleGUI/PySimpleGUI

๋ฌธ์ œ ์œ ํ˜• (๊ฐœ์„ , ์˜ค๋ฅ˜, ๋ฒ„๊ทธ, ์งˆ๋ฌธ)

tkinter์˜ ๋ฒ„๊ทธ / ๋ฌธ์ œ

no_titlebar๊ฐ€ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?
ํˆดํŒ์ด ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

์šด์˜ ์ฒด์ œ

๋งฅ

Python ๋ฒ„์ „

3.6 ์ด์ƒ

PySimpleGUI ํฌํŠธ ๋ฐ ๋ฒ„์ „

์ด๊ฒƒ์ด ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š” ํ•ด์ง€๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค.

8.610์„ ์‹คํ–‰ํ•˜๋Š” ์‚ฌ๋žŒ๊ณผ 8.6.10์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๋Š” ์‚ฌ๋žŒ์œผ๋กœ๋ถ€ํ„ฐ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด 8.6.10์—๋งŒ ํ•ด๋‹น๋˜๋Š”์ง€ ์ดํ•ดํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ์— ๋‹ค์Œ ์ค„์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ž์„ธํ•œ tkinter ๋ฒ„์ „์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

print(sg.tkinter.Tcl().eval('info patchlevel'))

๋ฌธ์ œ / ์งˆ๋ฌธ / ์„ธ๋ถ€ ์‚ฌํ•ญ ์„ค๋ช…

Mac์—์„œ no_titlebar ๋ฌธ์ œ๋ฅผ ๊ธฐ์–ตํ•˜๋ฉฐ ๋ฌธ์ œ๊ฐ€์žˆ์„ ๊ฒฝ์šฐ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ณต๋™์œผ๋กœ ๋…ธ๋ ฅํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๋ช…์˜ Mac ์‚ฌ์šฉ์ž์˜ ํ™•์‹คํ•œ ๋„์›€์ด ์ •๋ง ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜์žˆ๋Š” ์‚ฌ๋žŒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • ์ •ํ™•ํ•œ tkinter ๋ฒ„์ „ ์ •๋ณด ์–ป๊ธฐ (I ์ฝ”๋“œ ์ œ๊ณต)
  • GitHub์— ๊ฒŒ์‹œ ํ•  ๋•Œ ๋ช‡ ๊ฐ€์ง€ ์ž ์žฌ์  ์ธ ์ˆ˜์ • ์‚ฌํ•ญ์„ ์‹œ๋„ ํ•  ์ˆ˜ ์žˆ์Œ

๋ณต์ œ ํ•  ์ฝ”๋“œ

๋ฌธ์ œ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ  ๋ณด์—ฌ์ฃผ๋Š” ์งง์€ ํ”„๋กœ๊ทธ๋žจ (์ฆ‰, 400 ์ค„ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•œ ๋งํฌ๋ฅผ ๋ถ™์—ฌ ๋„ฃ์ง€ ๋งˆ์‹ญ์‹œ์˜ค .... ๋Œ€์‹  10 ์ค„ ํ”„๋กœ๊ทธ๋žจ ์ „์ฒด๋ฅผ ๋ถ™์—ฌ ๋„ฃ์œผ์‹ญ์‹œ์˜ค).

์˜ˆ, ๋ฌธ์ œ์˜ ๋ฒ”์œ„๋ฅผ ์ขํžˆ๋Š” ๊ฒƒ์€ ๊ณ ํ†ต ์Šค๋Ÿฝ์ง€๋งŒ ๋””๋ฒ„๊น… ํ”„๋กœ์„ธ์Šค์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ๋˜๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฆ‰์‹œ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ์‹คํ–‰ํ•  ์ˆ˜์žˆ๋Š” ํ•ญ๋ชฉ์„ ์ œ๊ณตํ•˜์—ฌ ๋„์›€์„์ฃผ์„ธ์š”.

์ด ๋ฏธ๋ฆฌ ์„œ์‹์ด ์ง€์ •๋œ ์ฝ”๋“œ ๋ธ”๋ก์€ ๋ชจ๋‘ ์ฝ”๋“œ์— ๋ถ™์—ฌ ๋„ฃ์„ ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

print(sg.tkinter.Tcl().eval('info patchlevel'))

๋‹ค์Œ์„ ์‹คํ–‰ํ•˜์—ฌ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”์ง€ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import PySimpleGUI as sg

sg.popup_no_titlebar('This should not have a titlebar')

image

Mac Specific Issue community input desired help wanted

๋ชจ๋“  30 ๋Œ“๊ธ€

๊ณผ๊ฑฐ์— ์ด๊ฒƒ์„ ๋””๋ฒ„๊น…ํ•˜๋Š” ๋ฌธ์ œ์˜ ์ผ๋ถ€๋Š” ๋””๋ฒ„๊น…์— ๋„์›€์ด๋˜๋Š” ์ ์ ˆํ•œ ํ…Œ์ด๋ธ”์ด ๋งŒ๋“ค์–ด์ง€์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์„ธ ๊ฐ€์ง€ ๋ณ€์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. PySimpleGUI ๋ฒ„์ „
  2. tkinter ๋ฒ„์ „
  3. MacOS ๋ฒ„์ „

๋Œ€๋ถ€๋ถ„์˜ ์‹œ๊ฐ„ ๋™์•ˆ ์ดˆ์ ์ด ๋œ ๊ฒƒ์€ tkinter ๋ฒ„์ „์ด์—ˆ์Šต๋‹ˆ๋‹ค. tkinter๊ฐ€ ๋ชจ๋“  ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ฑ…์ž„์ด ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚ด ๋ถ„์„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

PySimpleGUI v4.30.0
tkinter v8.6
MacOS 10.15.7

๋˜ํ•œ ํŒŒ์ด์ฌ ๋ฐ”์ด๋„ˆ๋ฆฌ์— Homebrew๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์–ธ๊ธ‰ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

Screen Shot 2020-10-28 at 8 10 31 PM

ํŽธ์ง‘ํ•˜๋‹ค:

Python v3.8.1

macOS High Sierra ๋ฒ„์ „ 10.13.6
PySimpleGUI ๋ฒ„์ „ 4.30.0.12
tcl ๋ฒ„์ „ = 8.6 tkinter ๋ฒ„์ „ = 8.6
tcl ์ƒ์„ธ ๋ฒ„์ „ = 8.6.10
Python ๋ฒ„์ „ 3.8.6

๊ทธ๋ฆฌ๊ณ  ... ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค!
it_works

ํŽธ์ง‘ : tkinter์™€ ๊ด€๋ จํ•˜์—ฌ ๋‚˜์—๊ฒŒ ๊ฐ€์žฅ ์ ์€ ๋‘ํ†ต์„ ์ค€ ํ™˜๊ฒฝ :

Homebrew-> brew ์„ค์น˜ tcl-tk
Homebrew-> brew install pyenv-> Python (์•„๋ž˜ ์ฐธ์กฐ)

env \
  PATH="$(brew --prefix tcl-tk)/bin:$PATH" \
  LDFLAGS="-L$(brew --prefix tcl-tk)/lib" \
  CPPFLAGS="-I$(brew --prefix tcl-tk)/include" \
  PKG_CONFIG_PATH="$(brew --prefix tcl-tk)/lib/pkgconfig" \
  CFLAGS="-I$(brew --prefix tcl-tk)/include" \
  PYTHON_CONFIGURE_OPTS="--enable-framework --with-tcltk-includes='-I$(brew --prefix tcl-tk)/include' --with-tcltk-libs='-L$(brew --prefix tcl-tk)/lib -ltcl8.6 -ltk8.6'" \
  pyenv install 3.8.6

pyenv global 3.8.6

์ด๊ฒƒ์„ ๋‚ด ๊ธฐ๋ณธ ํŒŒ์ด์ฌ์œผ๋กœ ๋งŒ๋“ค๋ ค๋ฉด :

echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.bash_profile

@norambna์— ๋‚˜์—ด๋œ ๋ชจ๋“  ๋‹จ๊ณ„๋ฅผ

Python v3.8.6
PySimpleGUI v4.30.0
tkinter v8.6
MacOS 10.15.7
pyenv v1.2.21
tcl-tk v8.6.10

image

๋„์›€์ด๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค! ๋ชจ๋“  macOS / tkinter ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ๋Š” ๋ฐ ์–ด๋ ค์›€์„ ๊ฒช์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ชจ๋“  tkinter ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ๋ถ„๋ช…ํžˆ macOS์—์„œ ์ž‘์—…ํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

tkinter ๋ฒ„์ „ 8.6.10์ด์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๊นŒ?

8.6.10์„ ์ œ์™ธํ•œ ๋ชจ๋“  ๋ฒ„์ „์— ๋ฌธ์ œ๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ๋ฒ„์ „์„ ํ™•์ธํ•˜๊ณ  8.6.10์ด ์•„๋‹Œ ๋ฆด๋ฆฌ์Šค์—๋งŒ "์ˆ˜์ •"์„ ์ ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ •๋ง๋กœ ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œํ–ˆ๋˜ ๊ฒƒ์€ ์ด๊ฒƒ์ด ์ตœ๊ทผ์˜ ๋ฌธ์ œ์ด๊ฑฐ๋‚˜ Mac์—์„œ ์ œ๋ชฉ ํ‘œ์‹œ ์ค„์ด ์ž‘๋™ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ๊ฒฐ์ฝ” ํšจ๊ณผ๊ฐ€ ์—†์—ˆ์„ ๊ฒƒ์ด ์ด์ƒํ•ด ๋ณด์ด์ง€๋งŒ ํ™•์‹คํžˆ ๋งํ•˜๊ธฐ๋Š” ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋ณธ "์ˆ˜์ •"์€ ์ž ์žฌ์ ์œผ๋กœ ๋‹ค๋ฅธ ๊ฒƒ๋“ค์„ ๋ง์น  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๋ง์„ค์˜€์Šต๋‹ˆ๋‹ค.

์ด ๋‹จ๊ณ„๋Š” ๋งค์šฐ ์ถ”์•…ํ•˜๋ฏ€๋กœ ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋ญ”๊ฐ€๋ฅผํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ์ด๋ ‡๊ฒŒ ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ๊ฒช์„ ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. tkinter ๋ฒ„์ „ ๋ฒˆํ˜ธ๋ฅผ ํ™•์ธํ•˜๊ณ  ๋ฒ„์ „์ด 8.6.10์ด ์•„๋‹Œ ๊ฒฝ์šฐ์—๋งŒ ์ ์šฉํ•˜๋Š” ์ˆ˜์ • ์‚ฌํ•ญ์ด ํฌํ•จ ๋œ GitHub ์šฉ ๋ฆด๋ฆฌ์Šค๋ฅผ ํ•จ๊ป˜ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

tkinter ๋ฒ„์ „ 8.6.10์ด์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๊นŒ?

์ €์—๊ฒŒ๋Š” ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. 8.6.10์€ ์ˆ˜๋งŽ์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

๋ฒ„์ „์ด 8.6.10 ๋ฏธ๋งŒ์ธ ๊ฒฝ์šฐ ํŒจ์น˜๊ฐ€ ํฌํ•จ ๋œ 4.30.0.13์„ ๋ฐฉ๊ธˆ ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋ฌธ์ œ๋ฅผ "์ˆ˜์ •"ํ•œ๋‹ค๋ฉด, ํŒจ์น˜๋ฅผ ํ•˜๋‚˜ ๋” ์‹œ๋„ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด ์ƒˆ ํŒจ์น˜๋Š” ์ฒ˜์Œ ์„ค์ • ํ•œ ํ›„ wm_overrideredirect ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง€ ์›๋‹ˆ๋‹ค.

root.wm_overrideredirect(True)
root.wm_overrideredirect(False)

๋‹ค์Œ์— ์‹œ๋„ํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ์€ ์ž‘์—…์ด True False True๊ฐ€๋˜๋„๋ก ๋‹ค์‹œ True๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์•„์ด๋””์–ด๋Š” ์ผ๋ถ€ ์‹œ์Šคํ…œ์˜ ๊ฒฝ์šฐ ๊ฐ’์ด True๋กœ ์„ค์ •๋˜๋ฉด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ๊ฒƒ์€ ํ˜„์žฌ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋Š” ๋ชจ๋“  ์„ค์น˜๋ฅผ ์ค‘๋‹จํ•˜๊ณ  ๋‹ค์‹œ True๋กœ ์„ค์ •ํ•˜๋ฉด Mac์˜ ๋ชจ๋“  tkinter ๋ฒ„์ „์—์„œ ์˜ฌ๋ฐ”๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒจ์น˜๊ฐ€ ์ ์šฉ๋˜๋ฉด ์ฝ˜์†”์— ๋‹ค์Œ ๋ฉ”์‹œ์ง€๊ฐ€ ์ธ์‡„๋ฉ๋‹ˆ๋‹ค.
* Applying Mac no_titlebar patch *

์ด๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ํŒ์—…์„ ํ˜ธ์ถœํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„๋˜๋Š” ํ…Œ์ŠคํŠธ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ๋„๊ตฌ์˜ ํƒญ ์ค‘ ํ•˜๋‚˜ (PySimpleGUI.py ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ sg.main() ํ˜ธ์ถœํ•˜์—ฌ ํ˜ธ์ถœ ๋จ)๋Š” ํŒ์—…์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

image

์ด๋ ‡๊ฒŒํ•˜๋ฉด ์ œ๋ชฉ ํ‘œ์‹œ ์ค„์ด์žˆ๋Š” ํŒ์—…์„ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ œ๋ชฉ ํ‘œ์‹œ ์ค„์ด์—†๋Š” ์ฐฝ์„ ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐฐ๊ฒฝ์ด ํ…Œ์ŠคํŠธ ์ฐฝ๊ณผ ๋™์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฐพ๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. No Titlebar ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด์ด ์ž‘์€ ์ฐฝ์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

image

์ด๋กœ ์ธํ•ด 8.6.10์ด ์•„๋‹Œ ๋ฒ„์ „์ด ์ˆ˜์ •๋˜๊ณ  8.6.10 ์ด์ƒ์—์„œ ์‹คํ–‰๋˜์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋‹ค์‹œ ์„ค์ •์ด ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ๋ฅผ ์‹ ์†ํ•˜๊ฒŒ ๊ตฌ์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฉด ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋†’์€ ๋ฆด๋ฆฌ์Šค๋กœ PyPI์— ๋ฆด๋ฆฌ์Šค๋ฅผ ๊ฒŒ์‹œ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Macs ์‚ฌ์šฉ์ž์˜ ๋„์›€์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ œ๋ชฉ ํ‘œ์‹œ ์ค„์ด์—†๋Š”์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด GitHub์— ํŒจ์น˜๊ฐ€ ๊ฒŒ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์‚ฌํ•ญ์„ ์ดํ•ดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

  • ํŒจ์น˜๋Š” 8., 6.10์ด ์•„๋‹Œ ์‹œ์Šคํ…œ์˜ ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ํŒจ์น˜๋Š” 8.6.10์—์„œ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€ GitHub ๋ฒ„์ „์„ ๋‹ค์šด๋กœ๋“œํ•˜์—ฌ ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋•๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. tkinter ๋ฒ„์ „๊นŒ์ง€ ๋ชจ๋“  ๊ฒƒ์ด ์„ค์ •๋˜์—ˆ์ง€๋งŒ PySimpleGUI์˜ 4.30.0.13 ๋ฒ„์ „์„ ๊ฐ€์ ธ ์˜ค๋Š” ๋ฐฉ๋ฒ•์„ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ฒ„์ „์„ ์ •ํ™•ํžˆ ์–ด๋–ป๊ฒŒ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ?

๋Œ€๋ถ€๋ถ„์˜ ์—…๋ฐ์ดํŠธ ๋ฒ„์ „์—์„œ ๋™์ผํ•œ ํŒจ์น˜๊ฐ€ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

PySimpleGUI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ GitHub์—์„œ ์—…๊ทธ๋ ˆ์ด๋“œ

์ด ํŒจ์น˜์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒํ•ด์•ผํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ง€๊ธˆ PyPI์— ๋Œ€ํ•œ ๋ฆด๋ฆฌ์Šค๋ฅผ ๋ชจ์œผ๊ณ  ์žˆ์œผ๋ฉฐ Mac์—์„œ ์ œ๋Œ€๋กœ ํ…Œ์ŠคํŠธ๋˜์ง€ ์•Š์œผ๋ฉด ๋ฆด๋ฆฌ์Šค์—์„œ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ž ์žฌ์ ์œผ๋กœ ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ๋ฌธ์ œ ์„ธํŠธ๋ณด๋‹ค ์•Œ๋ ค์ง„ ๋ฌธ์ œ๋ฅผ ๊ณต๊ฐœํ•˜๋Š” ํŽธ์ด ๋‚ซ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ œ๊ฐ€ ์„ ํ˜ธํ•˜๋Š” ๊ฒƒ์€์ด ๋ฌธ์ œ๋ฅผ ์ž˜ ํ•ด๊ฒฐํ•˜๊ณ  PyPI์— ๊ฒŒ์‹œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ช‡ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜์žˆ๋Š” Mac ์‚ฌ์šฉ์ž๊ฐ€ ์žˆ๋‹ค๋ฉด ์ €์™€ ๋™๋ฃŒ Mac ์‚ฌ์šฉ์ž ์ค‘ ์ผ๋ถ€๊ฐ€ ๋„์›€์„ ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

Mac ์‚ฌ์šฉ์ž๊ฐ€ ์ƒˆ ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธ ํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ๋ฆด๋ฆฌ์Šค๋ฅผ ์—ฐ๊ธฐํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํŒจ์น˜๊ฐ€ ์‹คํ–‰๋˜๋Š”์‹œ๊ธฐ๋ฅผ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด ๋” ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด "์ˆ˜์ •"์„ ๊ทธ๋ƒฅ ๋ฒ„๋ฆฌ๊ณ  ์ž ์žฌ์ ์œผ๋กœ ๊ธฐ์กด Mac ์‚ฌ์šฉ์ž๋ฅผ ๋ง์น  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๊ธ€์Ž„, ๊ธฐ์ˆ ์ ์œผ๋กœ๋Š” ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์˜ค๋Š˜๋‚  ์ž‘์—… ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค์ง€ ์•Š๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

Mac์—์„œ ์ œ๋ชฉ ํ‘œ์‹œ ์ค„์ด์—†๋Š” ์ฐฝ์— ๋Œ€ํ•œ ํŒจ์น˜๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ๋งค๊ฐœ ๋ณ€์ˆ˜ enable_mac_notitlebar_patch ๋ฅผ True๋กœ ์„ค์ •ํ•˜์—ฌ set_options ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

    sg.set_options(enable_mac_notitlebar_patch=True)

์ด ํŒจ์น˜๋Š” ์ œ๋ชฉ ํ‘œ์‹œ ์ค„์ด์—†๋Š” ์ฐฝ์ด ์ƒ์„ฑ ๋  ๋•Œ ์ถ”๊ฐ€ ํ˜ธ์ถœ์„ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

root.wm_overrideredirect(False)

ํŒจ์น˜๋Š” tkinter ๋ฒ„์ „ <8.6.10์„ ์‹คํ–‰ํ•˜๋Š” Mac์—์„œ๋งŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ํŒจ์น˜๋Š” ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. set_options ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํŒจ์น˜๋ฅผ ์–ป์œผ๋ ค๋ฉด ๊ธ์ •์  ์ธ ์กฐ์น˜๋ฅผ ์ทจํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด ์ฝ”๋“œ๋Š” ๋ฒ„์ „ 4.30.0.26์ด๋ฉฐ ํ˜„์žฌ GitHub์— ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณง 4.31.0 ๋ฒ„์ „์œผ๋กœ ์ถœ์‹œ ๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

์ด์ „์— ๋งํ–ˆ๋“ฏ์ด ์ด์ „ ํŒจ์น˜์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ ํ•  ์˜ํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋กœ ๋‹ค๋ฅธ ๋ฒ„์ „์˜ OS๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋‘ ๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ Mac ์žฅ์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‹ค์–‘ํ•œ ๋ฒ„์ „์˜ python๊ณผ tcl / tk๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฉ์ฒญํ•œ ์งˆ๋ฌธ ์ธ ๊ฒฝ์šฐ ์‚ฌ๊ณผ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ๋ฒ„์ „ (4.30.0.13 ๋˜๋Š” 4.30.026)์„ ์–ด๋–ป๊ฒŒ ์„ค์น˜ํ•ฉ๋‹ˆ๊นŒ? ๋‚˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ pip ์„ค์น˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ๋‹ค๋ฉด ๋„์›€์ด ๋  ์•ฝ๊ฐ„์˜ ์ง€์นจ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

4.31.0์€ ์˜ค๋Š˜ ์ดˆ PyPI์— ๊ฒŒ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ฒ„์ „์ด์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ pip ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ „ ๊ฒŒ์‹œ๋ฌผ์˜ ์ฝ”๋“œ ์ค„์„ ์ถ”๊ฐ€ํ•˜๋ฉด ํŒจ์น˜๊ฐ€ ํ™œ์„ฑํ™” ๋œ ์ƒํƒœ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

 sg.set_options(enable_mac_notitlebar_patch=True)

"Upgade"๋ผ๊ณ  ํ‘œ์‹œ๋œ ๋นจ๊ฐ„์ƒ‰ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ sg.main () ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ GitHub ๋ฒ„์ „์„ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 4.31.0์€ GitHub์˜ ํ˜„์žฌ ๋ฒ„์ „์ด๋ฉฐ PyPI์— ์ถœ์‹œ ๋œ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ฒ„์ „์˜ tcl / tk (8.5.9, 8.6.8, 8.6.10)์—์„œ ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ ํ•œ ๊ฒฐ๊ณผ ์›๋ณธ ์ฝ”๋“œ๊ฐ€
image
์ œ๋ชฉ ํ‘œ์‹œ ์ค„์ด ๋น„ํ™œ์„ฑํ™” ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์ตœ์†Œํ™” ๋˜๋Š” x ๋ฒ„ํŠผ์„ ํด๋ฆญ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ์†Œํ™” ํ•œ ๋‹ค์Œ ๋‹ค์‹œ ๊ฐ€์ ธ ์˜ค๋ฉด ์ œ๋ชฉ ํ‘œ์‹œ ์ค„์ด ์™„์ „ํžˆ ๋น„ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ 8.5.9 ๋ฐ 8.6.8 ๋ชจ๋‘์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด 8.6.10์—์„œ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. (์ด์ „ ์˜๊ฒฌ์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด)

๋‹ค์Œ์œผ๋กœ ํŒจ์น˜๋กœ ์‹คํ–‰ ํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.
image
๊ฒฐ๊ตญ ์ œ๋ชฉ ํ‘œ์‹œ ์ค„์ด ํ™œ์„ฑํ™”๋˜๊ณ  ์ตœ์†Œํ™” ๋ฐ x ๋ฒ„ํŠผ์ด ๋ชจ๋‘ ์ž‘๋™ํ–ˆ์œผ๋ฉฐ, ์ตœ์†Œํ™”ํ•˜๊ณ  ์ฐฝ์„ ๋‹ค์‹œ ๊ฐ€์ ธ ์˜ค๋ฉด ์œ„์—์„œ ์–ธ๊ธ‰ ํ•œ ๊ฒƒ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ๋น„ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ฌธ์ œ๋Š” ๋ฒ„์ „ 8.6.8 ์ดํ•˜์—์„œ ์—ฌ์ „ํžˆ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ œ๋ชฉ ํ‘œ์‹œ ์ค„์ด์—†๋Š” ๋“œ๋ž˜๊ทธ ๊ฐ€๋Šฅํ•œ ์ฐฝ์„ ์–ป๊ธฐ ์œ„ํ•ด tkinter๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์›๋ž˜ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
image
์ œ๋ชฉ ํ‘œ์‹œ ์ค„์„ ์ˆจ๊ธฐ๋ ค๋Š”์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ฃผ๋ณ€์„ ๊ฒ€์ƒ‰ ํ•  ๋•Œ์ด ์ฝ”๋“œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ tcl / tk 8.6.8 ์ดํ•˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
https://stackoverflow.com/questions/29641616/drag-window-when-using-overrideredirect

๋ฒ„์ „
MacOS : 10.15.7
PySimpleGUI : 4.31.0 ์ตœ์‹ 
Python : 3.8.1, 3.8.6, 3.9.0

tcl / tk 8.6.8 ์ดํ•˜
ํŒจ์น˜ ๋˜๋Š” ์›๋ณธ ์˜ˆ์ œ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Œ

ํŒจ์น˜๊ฐ€ ์ ์šฉ๋˜๊ณ  ์žˆ๋‹ค๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ์ฝ˜์†”์— ํ‘œ์‹œ ๋˜์—ˆ์Šต๋‹ˆ๊นŒ?

ํ…Œ์ŠคํŠธ์—์„œ ์ด์ƒํ•œ ์ ์€ ์ œ๋ชฉ ํ‘œ์‹œ ์ค„ ์—†์Œ์„ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์ˆ ์ด ์ด์ „์— ์—ฌ๊ธฐ์— ๊ฒŒ์‹œ ๋œ ๊ธฐ์ˆ ์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์žฌ์ •์˜๋ฅผ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒƒ์ด์ง€๋งŒ False ๊ฐ’์ž…๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ์ž ๊ธˆ ๋™์ž‘์ด ์žˆ๋‹ค๋Š” ๊ฒƒ๋„ ์ด์ƒํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

'* Applying Mac no_titlebar patch *

์ด ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์œผ๋ฉด ํŒจ์น˜๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๋ณ€์ˆ˜ ์กฐํ•ฉ์œผ๋กœ ์ž‘์—…ํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด tkinter ๋ฒ„์ „์„ ์ธ์‡„ํ•˜๋Š” ๊ฒƒ ์™ธ์—๋„ PySimpleGUI ๋ฒ„์ „์„ ์ธ์‡„ํ•˜๋ฉด ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” MacOS๊ฐ€ ์—ฌ๊ธฐ์„œ๋„ ์—ญํ• ์„ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ ์  ๋” ์˜์‹ฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ฌํ•ด ์ดˆ๊นŒ์ง€์ด ์ œ๋ชฉ ํ‘œ์‹œ ์ค„์ด์—†๋Š” ๋ฌธ์ œ์™€ ๋„๊ตฌ ์„ค๋ช… ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋“ฃ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์€ PySimpleGUI์—์„œ ์ฒ˜์Œ์œผ๋กœ ์ถœ์‹œ ๋œ ๊ธฐ๋Šฅ ์ค‘ ์ผ๋ถ€ ์˜€์ง€๋งŒ ์–ผ๋งˆ ์ „๊นŒ์ง€ ๋งŒํ•ด๋„ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋ฌธ์ œ๋ณด๊ณ ๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์˜ drag-anywhere ๋ถ€๋ถ„์€ ์ด์ „์— ๋…ผ์˜๋˜์ง€ ์•Š์•˜์œผ๋ฉฐ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค. ์ œ๋ชฉ์—†๋Š” ๋ฐ”์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์ž‘๋™ํ•˜๋Š” ๋ฐ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด์— ๋Œ€ํ•œ "์ˆ˜์ •"์€ Mac ์‚ฌ์šฉ์ž๊ฐ€ tkinter 8.6.10์„ ์‹คํ–‰ํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ €๋Š” ๋ถ„๋ช…ํžˆ Mac ์†Œํ”„ํŠธ์›จ์–ด์˜ ๋ฒ„๊ทธ ์ธ ๋ฌธ์ œ์— ๋„ˆ๋ฌด ๋งŽ์€ ์‹œ๊ฐ„๊ณผ ์—๋„ˆ์ง€๋ฅผ ์†Œ๋น„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์€์ด ์ž‘์—…์„ ์™„๋ฃŒํ•˜๊ธฐ ๊ฑฐ์˜ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋‚˜๋Š” 6 ๋…„ ๋„˜๊ฒŒ ์•Œ๋ ค์ง„ ๋ฌธ์ œ ์˜€์ง€๋งŒ ์•„์ง ์ˆ˜์ •๋˜์ง€ ์•Š์€ tk ๋ฒ„ํŠผ ๋ฒ„๊ทธ๋กœ ์ „์— ํ•œ ๋ฒˆ ์—ฌ๊ธฐ์— ์™”์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์€ PySimpleGUI์— ttk ๋ฒ„ํŠผ์— ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งŽ์€ ์ž‘์—… ์ด์—ˆ์ง€๋งŒ ๊ถ๊ทน์ ์œผ๋กœ Mac ์‚ฌ์šฉ์ž๊ฐ€ PySimpleGUI๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๊ฒŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฒ„๊ทธ์™€ ๋‹ฌ๋ฆฌ์ด ๋ฒ„๊ทธ๋Š” tkinter / Mac ๊ฐœ๋ฐœ์ž์˜ ๊ด€์‹ฌ์„ ๋Œ์—ˆ๋˜ ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ 8.6.10์—์„œ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ํ•ดํ‚น ๋ฐ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฝ”๋“œ์— ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ ๋„ Mac ์‚ฌ์šฉ์ž๊ฐ€ ์Šค์Šค๋กœ ์ ‘๊ทผ ํ•  ์ˆ˜์žˆ๋Š” ๊ฒฝ๋กœ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‚ด Mac ์‚ฌ์šฉ์ž๋ฅผ ์ข‹์•„ํ•˜์ง€๋งŒ ์‚ฌ์šฉ์ž ์ˆ˜๊ฐ€ ์ ์„ ๋•Œ ํ•ด๋‹น ํ”Œ๋žซํผ์„ ์ง€์›ํ•˜๋Š” ๋ฐ ๋„ˆ๋ฌด ๋งŽ์€ ํˆฌ์ž๋ฅผํ•˜๋Š” ๊ฒƒ์„ ์ •๋‹นํ™”ํ•˜๊ธฐ๋Š” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” Mac์—์„œ ์„ค์น˜๊ฐ€ 10 %๋ฅผ ๋ŒํŒŒ ํ•œ ์ ์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

image

์˜ˆ, ์†Œ๊ทœ๋ชจ ์‚ฌ์šฉ์ž ๊ทธ๋ฃน์—๊ฒŒ๋Š” ํฐ ๋ฒˆ๊ฑฐ ๋กœ์›€์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๋ฐฉ๊ธˆ macOS v11 (์ด๋ฒˆ ์ฃผ์— ์ƒˆ๋กœ ์ถœ์‹œ๋จ)์„ ๋‹ค์šด๋กœ๋“œํ–ˆ๋Š”๋ฐ ๋‹ค๋ฅธ ๋™์ž‘์ด์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด์ „ ๊ฒŒ์‹œ๋ฌผ๊ณผ ๋‹ฌ๋ฆฌ ์ตœ์†Œํ™” ๋ฐ x ๋ฒ„ํŠผ์ด ์™„์ „ํžˆ ๋น„ํ™œ์„ฑํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

macOS v11์—์„œ tkinter๋กœ๋„ ์•Œ์•„ ์ฐจ๋ฆฐ ํ•œ ๊ฐ€์ง€๋Š” tk / tcl v8.5.9์˜ ๊ฒฝ์šฐ ์ œ๋ชฉ ํ‘œ์‹œ ์ค„์ด์—†๋Š” ๊ฒฝ์šฐ root.overrideredirect(True) ๋ผ๊ณ  ๋งํ•˜๋ฉด๋˜์ง€๋งŒ tk / tcl v8.6.8์—์„œ๋„ ๋˜‘๊ฐ™์ดํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ฌ์ „ํžˆํ•ด์•ผํ•œ๋‹ค

root.overrideredirect(True)
root.overrideredirect(False)

์ž‘๋™์‹œํ‚ค๊ธฐ ์œ„ํ•ด.

์ฐธ๊ณ ๋กœ, ํŒจ์น˜๊ฐ€ ์ ์šฉ๋˜๊ณ  ์žˆ๋‹ค๋Š” ๋กœ๊ทธ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋˜ PySimpleGUI ๋ฒ„์ „์€ 4.31.0 Released 13-Nov-2020์ด์—ˆ์Šต๋‹ˆ๋‹ค.

Mac ํ”Œ๋žซํผ์— ํŠน์ •ํ•œ ์ผ๋ถ€ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์†Œ๊ทœ๋ชจ ์‚ฌ์šฉ์ž ๊ทธ๋ฃน์„ ์ง€์›ํ•ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ๊ทธ๊ฒƒ์ด ์›€์ง์ด๋Š” ํ‘œ์  ์ด์—ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ตœ๊ทผ์— ์•ˆ์ •๋œ ๋ฐœํŒ์„ ์ฐพ์„ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. Mac ์‚ฌ์šฉ์ž๊ฐ€ Homebrew ๋Œ€์‹  Python.org์—์„œ ์„ค์น˜๋กœ ์ „ํ™˜ ํ•œ ํ›„ ์ƒํ™ฉ์ด ์ข‹์•„ ๋ณด์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋ฒ„ํŠผ๊ณผ ํ…Œ์ด๋ธ”์— ๋ฌธ์ œ๊ฐ€์žˆ๋Š” ๋ฆด๋ฆฌ์Šค์—์„œ ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์„ ๋ฉ€์–ด์ง€๊ฒŒํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ญ”๊ฐ€ ๋ณ€ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ญ”๊ฐ€ ๋งฅ ์˜ค์—์Šค๊ฐ€ ์•„๋‹๊นŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์•ž์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์„ธ ๊ฐ€์ง€ ๋ณ€์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. tkinter ๋ฒ„์ „, PySimpleGUI ๋ฒ„์ „ ๋ฐ MacOC ๋ฒ„์ „์ด ์žˆ์Šต๋‹ˆ๋‹ค. tkinter๊ฐ€ Python์œผ๋กœ ํŒจํ‚ค์ง€๋˜์–ด ์žˆ๊ณ  Python์˜ ๋ฆด๋ฆฌ์Šค๋งˆ๋‹ค ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์ง€๋งŒ tkinter ๋ฒ„์ „์„ ์ถ”์ ํ•˜๋Š” ํ•œ Python ๋ฒ„์ „์€ ์ค‘์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๋ชฉ๋ก์—์„œ Python ๋ฒ„์ „์„ ๋ฒ„๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ํ•ธ๋“ค์ด ์—†๋‹ค. ์กฐํ•ฉ์ด "์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค"๋Š” ๋ณด๊ณ ์„œ ์ด์™ธ์˜ 3 ๊ฐ€์ง€ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๊ฒƒ์ด๋‹ค.

8.5.9๋กœ ๋ฌด์—‡์ด๋“ ํ•˜๋Š” ๊ฒƒ์€ ๋„ˆ๋ฌด ๋ฉ€๋ฆฌ ๋Œ์•„๊ฐ€๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. PySimpleGUI๋Š” 6 ๋…„ ์ „์œผ๋กœ ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ฐ€๋Š” Python 3.4 ์ด์ƒ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋„์ „ ์ด์—ˆ์ง€๋งŒ Raspberry Pi๊ฐ€ ์ข…์ข…์ด ๋ฒ„์ „์˜ Python๊ณผ ํ•จ๊ป˜ ์ œ๊ณต๋˜๋ฏ€๋กœ ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. Pi ์‚ฌ์šฉ์ž์—๊ฒŒ Python ๋ฒ„์ „์„ ์—…๋ฐ์ดํŠธํ•˜๋„๋ก ๊ฐ•์š”ํ•˜๋Š” ๊ฒƒ ์™ธ์—๋Š”์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ๊ฑฐ์˜ ์—†์œผ๋ฉฐ ์‚ฌ์†Œํ•œ ์ผ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡๊ฒŒํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

8.5.9๋Š” 10 ๋…„ ์ „์— ์ถœ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ์ปจํ…์ŠคํŠธ ... ๊ฐ™์€ ํ•ด 8.5.9๊ฐ€ ๋ฆด๋ฆฌ์Šค๋˜์—ˆ์œผ๋ฏ€๋กœ 2.7.0๋„ ๋ฆด๋ฆฌ์Šค๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Python 3์€ 3.1์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ๊ฐ€์น˜๊ฐ€ ๋˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ๋ฉ€๋ฆฌ ๋Œ์•„๊ฐ€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๋งฅ๋ฝ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ํ•œ๋•Œ ์ œ๋ชฉ ํ‘œ์‹œ ์ค„์ด ์ž‘๋™ํ•˜์ง€ ์•Š์•˜ ์Œ์„ ๋ณด์—ฌ์ฃผ๊ธฐ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์–ด๋–ค ๊ฒƒ์˜ ์ž‘๋™ ๋ฒ„์ „์„ ์ฐพ๊ธฐ ์œ„ํ•ด 10 ๋…„์„ ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ฐ€๋Š” ๊ฒƒ์€ ๋งค์šฐ ๊ทน๋‹จ์ ์ž…๋‹ˆ๋‹ค. ์†Œํ”„ํŠธ์›จ์–ด์˜ ์ผ์ƒ์ž…๋‹ˆ๋‹ค.

MacOS v11์ด tkinter์˜ ์ž‘๋™ ๋ฐฉ์‹๊ณผ ๊ด€๋ จ์ด ์žˆ๋‹ค๋Š” ์†Œ์‹์„ ๋“ฃ๋Š” ๊ฒƒ์€ ํ›จ์”ฌ ๋” ์งœ์ฆ์ด๋‚ฉ๋‹ˆ๋‹ค. OS ์ž์ฒด๋Š” tkinter์™€ Python์˜ ์ž‘๋™ ๋ฐฉ์‹์— ์˜ํ–ฅ์„์ฃผ์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค.

ํŒจ์น˜๊ฐ€ wm_overrideredirect๋ฅผ ๋‹ค์‹œ False๋กœ ์„ค์ •ํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธ์ •์  ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์•˜๋‹ค๋Š” ์†Œ์‹์„ ๋“ฃ๊ณ  ์‹ค๋ง ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ Mac์—์„œ ์ œ๋ชฉ ํ‘œ์‹œ ์ค„์ด์—†๋Š” ๊ฒฝ์šฐ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

                MyFlexForm.TKroot.wm_overrideredirect(True)
                # Special case for Mac. Need to clear flag again if not tkinter version 8.6.10+
                if sys.platform.startswith('darwin') and ENABLE_MAC_NOTITLEBAR_PATCH and (sum([int(i) for i in tclversion_detailed.split('.')]) < 24):
                    print('* Applying Mac no_titlebar patch *')
                    MyFlexForm.TKroot.wm_overrideredirect(False)

wm_overrideredirect๋ฅผ ๋‹ค์‹œ False๋กœ ์„ค์ •ํ•˜๊ธฐ ์ง์ „์— "Application Mac no_titlebar patch"๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ๋ฒ„์ „์˜ tkinter์—์„œ ๋ชจ๋“  Mac OS ๋ฒ„์ „์—์„œ ์ž‘๋™ํ•˜๋Š” PySimpleGUI ๋ฒ„์ „์„ ๊ฒŒ์‹œํ•˜๊ณ  ์‹ถ์ง€๋งŒ ์ด๊ฒƒ์ด PySimpleGUI์˜ ์ดˆ๊ธฐ ์ถœ์‹œ ์ดํ›„ ์‹œ๋„ํ•ด ์™”์œผ๋ฉฐ ์ตœ์‹  ๋…ธ๋ ฅ์ด ์ผ๊ด€๋˜๊ฒŒ ์ง„ํ–‰๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ถ€์กฑํ•˜๋‹ค.

์ด ์‹œ์ ์—์„œ ๋‚ด๊ฐ€ ์•Œ๊ณ ์žˆ๋Š” ์œ ์ผํ•œ ์ž‘๋™ ์ˆ˜์ •์€ Mac ์‚ฌ์šฉ์ž๊ฐ€ 8.6.10์„ ์„ค์น˜ํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ž‘๋™ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋‚ณ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. PySimpleGUI "์ˆ˜์ •"์€ ๋ˆ„๊ตฐ๊ฐ€ ์ œ๋ชฉ ํ‘œ์‹œ ์ค„์ด์—†๋Š” ์ฐฝ์„ ๋งŒ๋“ค๋ ค๊ณ ํ•˜๊ฑฐ๋‚˜ ๋„๊ตฌ ์„ค๋ช…์„ ์„ค์ •ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์ธ์‡„๋˜๋Š” ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์„ฑ ๊ด€์ ์—์„œ ๋ณผ ๋•Œ ๋”์ฐํ•œ ํ•ด๊ฒฐ์ฑ…์ด์ง€๋งŒ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ tkinter์˜ 10 ๋…„ ๋œ ๋ฒ„์ „์„ ์„ค์น˜ํ•ด์•ผํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

Python ๋ฐ tkinter์˜ ํ™ˆ๋ธŒ๋ฅ˜ ์„ค์น˜ ์‚ฌ์šฉ์— ๋Œ€ํ•ด ์šฐ๋ คํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ™ˆ๋ธŒ๋ฅ˜๊ฐ€ ๋ฌธ์ œ์˜ ์›์ธ์ด๋ฉฐ Python.org์—์„œ ์„ค์น˜ํ•˜๋ฉด ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ ๋œ ๊ฒƒ์€ ์ž‘๋…„์— ๋ถˆ๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค.

wm_overrideredirect ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ํ˜ธ์ถœ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ tkinter root ๊ฐœ์ฒด์—์„œ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ Window ๋ฉค๋ฒ„ ๋ณ€์ˆ˜ window.TKroot ์‚ฌ์šฉํ•˜์—ฌ ์ง์ ‘ ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ด€๋ จ์„ฑ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์ง€๋งŒ ํ…Œ์ŠคํŠธ๋กœ ์ฐฝ์— ๋Œ€ํ•œ modal ์„ค์ •์„ ํ•ด์ œํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

tk / tcl 8.5.9์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ๊ทธ ๋ฒ„์ „์„ ์‚ฌ์šฉํ–ˆ๋˜ ์œ ์ผํ•œ ์ด์œ ๋Š” homebrew python 3.9.1 ์„ค์น˜์™€ ํ•จ๊ป˜ ํŒจํ‚ค์ง€ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๋“ค์ด ๋‚ด๊ฒŒ ์ค€ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‹น์‹ ์ด ๋งํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๊ทธ๊ฒƒ์€ ์ž์ž‘ ๋‚˜๋ฌด ๋ฌธ์ œ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

python.org ๋ฆด๋ฆฌ์Šค ์ค‘ ์ผ๋ถ€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๋ฐ ์•ฝ๊ฐ„์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์ด ์ด๊ฒƒ์„ ์•Œ์•„๋‚ด๋Š” ๋ฐ ์•„๋ฌด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋‹ค๋ฅธ ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ์ข€ ๋” ํ†ต์ œ ๋œ ํ…Œ์ŠคํŠธ๋ฅผ ํ•  ์ˆ˜์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์•ฝ๊ฐ„์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ ์ด์ „์— ์–ธ๊ธ‰ ํ•œ ๊ฒƒ ์™ธ์— ์‹œ๋„ํ•ด๋ณด๊ณ  ์‹ถ์€ ํŠน์ • ์ž‘์—…์ด ์žˆ์œผ๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”.

์ œ๊ฐ€ ์–ธ๊ธ‰ํ•˜๊ณ  ์‹ถ์€ ๋˜ ๋‹ค๋ฅธ ๊ฒƒ์€ ์ œ๊ฐ€ tkinter๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ root.overrideredirect(True) ํ˜ธ์ถœ์„ํ•˜๋ฉด ์ฐฝ์ด ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ PySimpleGUI๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ œ๋ชฉ ํ‘œ์‹œ ์ค„์„ ์ œ๊ฑฐํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ์ฐฝ์„ ๋น„ํ™œ์„ฑํ™” ํ•  ๋ฟ์ด ๊ธฐ ๋•Œ๋ฌธ์— ์ €์—๊ฒŒ ๋ฌผ์–ด ๋ณด๋ฉด ๋” ๋งŽ์€ ์ž‘์—…์ด ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. (<8.6.10 ๋ฒ„์ „์˜ ๊ฒฝ์šฐ)

๋‚˜๋Š” ๋‹น์‹ ์ด ์ด๊ฒƒ์„ ์•Œ์•„๋‚ด๋Š” ๋ฐ ์•„๋ฌด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ธ€์Ž„ ....์ด ๊ธฐํšŒ์— ๋›ฐ์–ด ๋„˜์–ด ๋ณผ๊ฒŒ์š”. Mac ์‚ฌ์šฉ์ž๊ฐ€ 8.6.10์„ ๊ฐ•์ œ๋กœ ์„ค์น˜ํ•˜์ง€ ์•Š๋„๋ก์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์ฃผ์„์„ ํ†ตํ•ด ํ‘œ์‹œ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ์‰ฌ์šด ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค.

tk / tcl 8.5.9 ...์ด ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋Š” ์œ ์ผํ•œ ์ด์œ ๋Š” homebrew python 3.9.1 ์„ค์น˜์™€ ํ•จ๊ป˜ ํŒจํ‚ค์ง€ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

WOW .... ์ ํ”„ ํ‰๋ฒ”ํ•œ WOW ....

Python ์„ค์น˜์— Homebrew๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ์ƒ๊ฐ์ด ์•„๋‹Œ ์ด์œ ์— ๋Œ€ํ•œ ๊ทธ๋ž˜ํ”ฝ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค. ํ•œํŽธ์œผ๋กœ๋Š” "์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์—"์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•˜์ง€ ์•Š๋‹ค๊ณ  ๋งํ•˜๋Š” ์‚ฌ๋žŒ์„ ๋ณผ ์ˆ˜์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. 8.5.9 ์ดํ›„ ์ถ”๊ฐ€ ๋œ tkinter ์ฝ”๋“œ์˜ ์–‘์€ tkinter๊ฐ€ 10 ๋…„ ๋™์•ˆ ๊ฐ€๋งŒํžˆ ์žˆ์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๋‹นํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ๋†€๋ผ์šด ์†Œ์‹์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. :-( ์ฐธ ํž˜๋“  ์ „ํˆฌ์ž…๋‹ˆ๋‹ค.

Python.org์—์„œ ์„ค์น˜ํ•ด๋ณด์„ธ์š”. ์–ผ๋งˆ ์ „์— Python.org์—์„œ ์„ค์น˜ํ•ด์•ผ ํ•  ํ•„์š”์„ฑ์„ ์„ค๋ช…์„œ์— ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

https://pysimplegui.readthedocs.io/en/latest/#macs

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๊ฐ€ ๊ฐ‘์ž๊ธฐ ๋‚˜์˜จ ๊ฒƒ ๊ฐ™์•„ ๋„ˆ๋ฌด ์ด์ƒํ•ฉ๋‹ˆ๋‹ค. Mac ์‚ฌ์šฉ์ž์˜ ์ˆ˜๋Š” ์ ์ง€ ๋งŒ ์กด์žฌํ•˜๋ฉฐ tkinter์—์„œ PySimpleGUI๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์ด 2 ๋…„ ์ „์— ๋ง๊ฐ€ ์กŒ๋‹ค๋ฉด ๋ˆ„๊ตฐ๊ฐ€ ๋ญ”๊ฐ€ ๋งํ–ˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋ฒ„ํŠผ ์ƒ‰์ƒ ๋ฌธ์ œ์— ๋Œ€ํ•ด ๊ฐ€์žฅ ํ™•์‹คํžˆ ๋ถˆํ‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ๊ฐ€ ์‹ ์ค‘ํ•˜๊ฒŒ ๊ตฌ์„ฑ๋˜๊ณ  ์ถ”์ ๋˜๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์กฐํ•ฉ ๋งคํŠธ๋ฆญ์Šค๊ฐ€ ๋งค์šฐ ์œ ์šฉ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

_ ๋ชจ๋“  ๊ฒƒ์˜ ์ด์ „ ๋ฒ„์ „์„ ์‹œ๋„ํ•ด๋ณด๊ณ  ๋ฌด์–ธ๊ฐ€๊ฐ€ ๊นจ์งˆ ๋•Œ๊นŒ์ง€ ์•ž์œผ๋กœ ๋‚˜์•„๊ฐˆ ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”์ง€ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค ._

๊ทธ๊ฒƒ์ด ๋‚˜์˜ ์ด์ƒ์ ์ธ ๊ณ„ํš์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด 2 ์„ผํŠธ. ์ €๋Š” Mac ์‚ฌ์šฉ์ž๋Š” ์•„๋‹ˆ์ง€๋งŒ macOS ์šฉ Python์œผ๋กœ ๋ฌด์–ธ๊ฐ€๋ฅผ ๊ฐœ๋ฐœํ•ด์•ผํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ œํ•œ๋œ ๊ฒฝํ—˜์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.

๋ช‡ ๋‹ฌ ์ „์— ๋‚ด ์˜ต์…˜์„ ์‹œ๋„ํ–ˆ์„ ๋•Œ python.org์—์„œ ์ง์ ‘ ๋‹ค์šด๋กœ๋“œ ํ•œ ํŒŒ์ด์ฌ ๋ฒ„์ „์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋‹น์‹œ ์ €๋Š” Tcl / Tk 8.6.8๊ณผ ํ•จ๊ป˜ ์ œ๊ณต๋˜๋Š” python.org ๋ฒ„์ „ 3.6.8์— ๋งŽ์€ ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  PySimpleGUI์˜ ๋‹ค์–‘ํ•œ ์š”์†Œ๋ฅผ ์‹œ๋„ ํ•  ๋•Œ ํ™•์‹คํžˆ ๋ฒ„๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋‹จ์ง€ tkinter๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ macOS๋ฅผ ์œ„ํ•ด ๊ทธ๋ ‡๊ฒŒ ์„ธ๋ จ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ Python์˜ Homebrew ๋ฒ„์ „์€ Tcl / Tk์™€ ํ•จ๊ป˜ ์ œ๊ณต๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ( ์—ฌ๊ธฐ ๋ฐ ์—ฌ๊ธฐ ์ฐธ์กฐ). ๋ฌผ๋ก  ๋น„๊ณต์‹์  ์ธ "brews"๊ฐ€ ๋งŽ์ด์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Pyenv ๋ฒ„์ „์€ Tcl / Tk์™€ ํ•จ๊ป˜ ์ œ๊ณต๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ„์—์„œ ๊ฒŒ์‹œ ํ•œ ํŠธ๋ฆญ์„ ์‚ฌ์šฉํ•˜์—ฌ Tcl / Tk 8.6.10์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋งํ–ˆ๋“ฏ์ด ์—ฌ์ „ํžˆ ์™„๋ฒฝํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ํ…Œ์ŠคํŠธ์—์„œ๋Š” ํ™•์‹คํžˆ ๋” ๋‚˜์€ ์˜ต์…˜์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ œํ’ˆ์„ ๋งŒ๋“ค์–ด์•ผํ–ˆ๊ณ , ํšจ๊ณผ๊ฐ€์žˆ๋Š” ๊ฒƒ๊ณผ ํšจ๊ณผ๊ฐ€์—†๋Š” ๊ฒƒ์„ ํ…Œ์ŠคํŠธํ•˜๊ณ , ๋‚ด ํ”„๋กœ์ ํŠธ์— ํšจ๊ณผ๊ฐ€์žˆ๋Š” ๊ฒƒ์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

BTW, ๋ชจ๋‹ฌ ์ฐฝ์€ Tcl / Tk 8.6.8๊ณผ ํ•จ๊ป˜ ์ œ๊ณต๋˜๋Š” python.org ๋ฒ„์ „ 3.6.8์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉฐ pyenv python ๋ฐ Tcl / Tk 8.6.10์—๋„ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ๋ฅผ๋ณด์‹ญ์‹œ์˜ค .

ํŽธ์ง‘ : macOS๋Š” ์šด์˜ ์ฒด์ œ์˜ ์ผ๋ถ€๋กœ Tcl / Tk 8.5.9์™€ ํ•จ๊ป˜ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ์ด์ฌ์ด ์ตœ์‹  ๋ฒ„์ „ Tcl / Tk์™€ ํ•จ๊ป˜ ์ œ๊ณต๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ๋ฒ„์ „์„ ์–ป๊ฒŒ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Python์˜ ์ผ๋ฐ˜ brew ์„ค์น˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น Python์€ ์šด์˜ ์ฒด์ œ์™€ ํ•จ๊ป˜ ์ œ๊ณต๋˜๋Š” Tcl / Tk ๋ฒ„์ „์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ผ๋ฐ˜ ํ™ˆ๋ธŒ๋ฅ˜ ํŒŒ์ด์ฌ์„ ์‚ฌ์šฉํ•  ๋•Œ Tcl / Tk 8.5.9๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์ด ๋‚ด ํŠธ๋ฆญ์ด pyenv์˜ ํŒŒ์ด์ฌ์—๊ฒŒ tcl-tk์˜ ์ตœ์‹  brew ์„ค์น˜๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋ช…์‹œ ์ ์œผ๋กœ ์ง€์‹œํ•ด์•ผํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

์˜ค ... ๊ทธ ๋ชจ๋‹ฌ์„ ์žŠ์—ˆ ์–ด.

์šฐ๋ฆฌ๊ฐ€ ์‹คํ–‰ ํ•œ ํŒ์—… ํ…Œ์ŠคํŠธ๋Š” ๋ชจ๋‹ฌ์„ ๋น„ํ™œ์„ฑํ™” ํ•œ ์ƒํƒœ์—์„œ ์‹œ๋„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@tkozzer ....์ด ํŒ์—… ํ…Œ์ŠคํŠธ๋ฅผ ์‹œ๋„ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

sg.popup_no_titlebar('This should not have a titlebar', modal=False)

๋˜ํ•œ drag_anywhere๊ฐ€ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์ด ํŒ์—…๋„ ์‹œ๋„ํ•ด๋ณด์„ธ์š”.

sg.popup_no_titlebar('This should not have a titlebar', modal=False, grab_anywhere=False)

์„ค์ •๋˜๋Š” ์˜ต์…˜์— ๋Œ€ํ•ด ์ตœ๋Œ€ํ•œ์˜ ์ œ์–ด ๋ฐ ๊ฐ€์‹œ์„ฑ์„ ์–ป์œผ๋ ค๋ฉด ์ฐฝ ๋งŒ๋“ค๊ธฐ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์€ ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ• ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ž‘์—… ํ•  ์ˆ˜์žˆ๋Š” ํ”„๋กœ๊ทธ๋žจ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

import PySimpleGUI as sg


layout = [[sg.Text('A no-titlebar test')],
          [sg.Button('Ok'), sg.Button('Exit')]]

window = sg.Window('Title', layout, no_titlebar=True, grab_anywhere=False, modal=False)

while True:
    event, values = window.read()
    print(event, values)
    if event in (sg.WIN_CLOSED, 'Exit'):
        break

window.close()

PyPI๋ฅผ ๋น ๋ฅด๊ฒŒ ์ ์šฉํ•ด์•ผํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ์œผ๋ฏ€๋กœ ์˜ค๋Š˜ ๋ฆด๋ฆฌ์Šค๋ฅผ ์ค€๋น„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ฒ„์ „์˜ tkinter์— ๋Œ€ํ•ด Mac์—์„œ ๋ชจ๋‹ฌ ์ฐฝ์ด ์‹ค์ œ๋กœ ์†์ƒ๋˜๋ฉด ์ด๋ฒˆ ๋ฆด๋ฆฌ์Šค์—์„œ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ 8.6.10 ๋ฐ ๋‹ค๋ฅธ ๋ฒ„์ „์—์„œ ๋ชจ๋‹ฌ ์ฐฝ์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ์—ฌ์ „ํžˆ ์ด๋Ÿฌํ•œ ๋‹ค์–‘ํ•œ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š” tkinter์™€ MacOS์˜ ์กฐํ•ฉ์— ๋Œ€ํ•ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ชจ๋‹ฌ ์ฐฝ์ด Tcl / Tk 8.6.8๊ณผ ํ•จ๊ป˜ ์ œ๊ณต๋˜๋Š” python.org python 3.6.8์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋“ค์€ Homebrew์˜ Tcl / Tk 8.6.10๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š” pyenv์˜ python 3.6.11์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ ํŠน์ • ๋ฌธ์ œ๋กœ ์‹œ๋„ํ•œ ์œ ์ผํ•œ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.

pyenv๋Š” ์ž์ฒด์ ์œผ๋กœ ํŒจํ‚ค์ง€ / ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ตฌ์„ฑ์— ๋„์›€์ด๋ฉ๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ์„ค์น˜ํ•  ํ•ญ๋ชฉ๊ณผ ์ „ํ™˜ ํ•  ํ•ญ๋ชฉ์„ ์„ ํƒํ•˜๊ณ  ์„ ํƒํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

Mac์˜ ๊ฒฝ์šฐ Python ๋ฒ„์ „์€ tkinter๋งŒํผ ์ค‘์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ MacOS ๋ฒ„์ „์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. tkinter 8.6.8์€ 3.6, 3.7, 3.8, 3.9์—์„œ ์ •ํ™•ํžˆ ๋™์ผํ•˜๊ฒŒ ์‹คํ–‰๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅผ ์ˆ˜์žˆ๋Š” ๊ฒƒ์€ ์ ์–ด๋„ Windows์— 3.6, 3.7 ๋“ฑ์„ ์„ค์น˜ํ•  ๋•Œ ์„ค์น˜๋˜๋Š” tkinter์˜ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค. Python.org์—์„œ Python์„ ๊ฐ€์ ธ ์˜ค๋Š” ํ•œ ๊ฐ€์ง€ ์ด์œ ๋Š” ์„ค์น˜์™€ ํ•จ๊ป˜ ํŒจํ‚ค์ง€ ๋œ ํŠน์ • ๋ฒ„์ „์˜ tkinter๋ฅผ ๊ฐ€์ ธ ์˜ค๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

Python ๋ฒ„์ „์€ tkinter๋งŒํผ ์ค‘์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ MacOS ๋ฒ„์ „์€

๋ชจ๋“  ํ…Œ์ŠคํŠธ๋ฅผ์œ„ํ•œ macOS High Sierra ๋ฒ„์ „ 10.13.6.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰