Kivy: ๋“œ๋กญ๋‹ค์šด์€ ์—ด๋ฆฌ์ž๋งˆ์ž ๋‹ซํž™๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2017๋…„ 04์›” 28์ผ  ยท  6์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: kivy/kivy

๋ฒ„์ „

  • ํŒŒ์ด์ฌ: 2.7
  • ์šด์˜ ์ฒด์ œ: ์•ˆ๋“œ๋กœ์ด๋“œ
  • ํ‚ค๋น„: ๋งˆ์Šคํ„ฐ

์„ค๋ช…

์ตœ์‹  ๋ฒ„์ „์—์„œ๋Š” ๋“œ๋กญ๋‹ค์šด์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด์œ  ์—†์ด ๋‚˜ํƒ€๋‚ฌ๋‹ค๊ฐ€ ๋‹ซํž™๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” buildozer์˜ android_new ๋„๊ตฌ ์ฒด์ธ์„ ์‚ฌ์šฉํ•˜๋Š” Android ๋นŒ๋“œ์—์„œ๋งŒ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์•”ํ˜ธ

from kivy.app import App
from kivy.lang import Builder


kv = '''
BoxLayout:
    orientation: 'vertical'
    BoxLayout:
        size_hint_y: None
        height: '50sp'
        Button:
            id: button
            text: 'Open dropdown'
    Widget:

    DropDown:
        id: dropdown
        on_parent: self.dismiss()

        Button:
            size_hint_y: None
            text: 'item 1'
        Button:
            size_hint_y: None
            text: 'item 2'
        Button:
            size_hint_y: None
            text: 'item 3'
'''


class MyApp(App):
    def build(self):
        self.root = Builder.load_string(kv)
        self.root.ids.button.bind(on_release=self.root.ids.dropdown.open)
        return self.root


MyApp().run()

APK

MyApp-debug.zip

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋ฒ„ํŠผ์— on_parent: self.dismiss() ๋ฅผ ๋„ฃ์œผ๋ฉด ์˜๋„ํ•œ ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์•ฑ์ด ์ฒ˜์Œ ์‹คํ–‰๋  ๋•Œ ์ž๋™์œผ๋กœ DropDown์„ ์—ด์ง€ ์•Š์œผ๋ฉฐ ์—ด๋ฆฌ๋ฉด ์ž๋™์œผ๋กœ DropwDown์„ ๋‹ซ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ˜ธ์ถœ์„ on_parent: dropdown.dismiss() ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

์•ฝ๊ฐ„ "ํ•ดํ‚ค"ํ•˜์ง€๋งŒ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

#:kivy 1.0

<InputFileDropDown>:

    Button:
        id: btn
        text: 'Input File'
        on_parent: dropdown.dismiss()
        on_release: dropdown.open(self)
        size_hint_y: None
        height: 35

    DropDown:
        id: dropdown
        on_select: btn.text = '{}'.format(args[1])

        Button:
            text: 'First Item'
            size_hint_y: None
            height: 35
            on_release: dropdown.select('First Item')

        Label:
            text: 'Second Item'
            size_hint_y: None
            height: 35

        Button:
            text: 'Third Item'
            size_hint_y: None
            height: 35
            on_release: dropdown.select('Third Item')

'InputFileDropDown'์€ ์ฐธ๊ณ ์šฉ BoxLayout์ž…๋‹ˆ๋‹ค.

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

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์•ˆ์ •์ ์ธ ๋ฒ„๊ทธ๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  (์ ์–ด๋„ ๊ทธ๋Ÿฐ ์ฝ”๋“œ๊ฐ€ ๋‚˜์˜ค๋Š” ๊ณณ์—์„œ) ๋งˆ์Šคํ„ฐ์—์„œ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋” ๊ตฌ์ฒด์ ์œผ๋กœ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • DropDown์€ ์ž์‹์œผ๋กœ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค(์ˆ˜๋™์œผ๋กœ ์ถ”๊ฐ€ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—) -> ๋ถ€๋ชจ๊ฐ€ ์žˆ์Œ
  • on_parent ์ด๋ฒคํŠธ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋จ -> DropDown์„ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ (์™€์˜ ์ž์‹ ์˜ ํ–‰๋™์„ ํ†ตํ•ด ๋ญ”๊ฐ€๋ฅผ _attach_ํ•˜๋„๋ก๋˜์–ด ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค ๋“œ๋กญ ๋‹ค์šด์„ behing ๋…ผ๋ฆฌ _yet_, ์ง€๊ธˆ๊นŒ์ง€ ๋ฒŒ๊ธˆ์„ ๋ณด์ธ๋‹ค Dropdown.open(<widget>) )๊ณผ ์ผ๋ถ€ ์œ„์ ฏ์— CHILD_์„ _as ์ถ”๊ฐ€ _not_. ๊ธ€์Ž„, ์ฒ˜์Œ์— ์ž˜๋ชป ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— on_parent: self.dismiss() ๋กœ ์ˆจ๊ธฐ๋ ค๊ณ  ํ•  ๋•Œ ์ ์–ด๋„ ์ด ๋ฐฉ๋ฒ• ์€

  • DropDown์ด ํ•ด์ œ๋˜์—ˆ์ง€๋งŒ <widget>.bind(<stuff>) ๊ฐ€ DropDown.open() ๋ฉ”์„œ๋“œ์— ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— (์ง€๊ธˆ์€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ) ์œ„์ ฏ์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
  • DropDown์€ ์–ด๋”˜๊ฐ€์— ์ž์ฒด ๋™์ž‘์„ ํ†ตํ•ด ์ž์‹์œผ๋กœ ์ถ”๊ฐ€๋˜๊ณ (์•„๋งˆ ๋ฒ„ํŠผ์—, ์ง€๊ธˆ์€ ํ™•์‹คํ•˜์ง€ ์•Š์Œ) DropDown์˜ on_parent ๊ฐ€ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.
  • on_parent๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๊ณ  ํ•ด์ œ ์ด๋ฒคํŠธ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. <- ์ฐธ์กฐ?

์ž, ์ด์ œ ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”? ์šฐ์„  on_parent ์‚ฌ์šฉ์„ ์ค‘์ง€ํ•˜๊ณ  ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

<MyDropDown>:  # make a class in python (or use "@DropDown" and Factory)
    text: 'blah'
# and *don't* add it as a child manually

์ด๋Š” ์ง์ ‘ ์ž์‹์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  KV ๊ทœ์น™ ์ž์ฒด ๋งŒ ๋งŒ๋“œ๋Š” Spinner ๋ฅผ ํ•ด๋‹น ๋ชฉ์ ์„ ์œ„ํ•œ ๋นŒ๋“œ๋กœ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

์ด๋ก ์ ์œผ๋กœ on_parent ์—์„œ ์ง์ ‘ ๋˜๋Š” ์™ธ๋ถ€์—์„œ๋งŒ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ on_parent ์ด๋ฒคํŠธ๋ฅผ ๋ฐ”์ธ๋”ฉ ํ•ด์ œํ•  ์ˆ˜ ์žˆ์ง€๋งŒ "์ž‘๋™ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š”" ๋ฐฉ๋ฒ•์€ ์ถ”์•…ํ•ฉ๋‹ˆ๋‹ค. , ๊ทธ๋ž˜์„œ ์“ฐ์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜‹

๊ฐ์‚ฌ ํ•ด์š”. ๋‚˜๋Š” DropDown ๋ฅผ ์ƒˆ ํด๋ž˜์Šค๋กœ ์‚ฌ์šฉํ–ˆ๊ณ  ์ด๊ฒƒ์ด ํšจ๊ณผ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

kv ํŒŒ์ผ์—์„œ @DropDown ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ž์„ธํžˆ

๋‚˜๋Š” kivy 1.10.1, Windows 10, python 3.7์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ on_parent: self.dismiss()๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์œผ๋ฉด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋ฒ„ํŠผ์— on_parent: self.dismiss() ๋ฅผ ๋„ฃ์œผ๋ฉด ์˜๋„ํ•œ ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์•ฑ์ด ์ฒ˜์Œ ์‹คํ–‰๋  ๋•Œ ์ž๋™์œผ๋กœ DropDown์„ ์—ด์ง€ ์•Š์œผ๋ฉฐ ์—ด๋ฆฌ๋ฉด ์ž๋™์œผ๋กœ DropwDown์„ ๋‹ซ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ˜ธ์ถœ์„ on_parent: dropdown.dismiss() ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

์•ฝ๊ฐ„ "ํ•ดํ‚ค"ํ•˜์ง€๋งŒ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

#:kivy 1.0

<InputFileDropDown>:

    Button:
        id: btn
        text: 'Input File'
        on_parent: dropdown.dismiss()
        on_release: dropdown.open(self)
        size_hint_y: None
        height: 35

    DropDown:
        id: dropdown
        on_select: btn.text = '{}'.format(args[1])

        Button:
            text: 'First Item'
            size_hint_y: None
            height: 35
            on_release: dropdown.select('First Item')

        Label:
            text: 'Second Item'
            size_hint_y: None
            height: 35

        Button:
            text: 'Third Item'
            size_hint_y: None
            height: 35
            on_release: dropdown.select('Third Item')

'InputFileDropDown'์€ ์ฐธ๊ณ ์šฉ BoxLayout์ž…๋‹ˆ๋‹ค.

@GaryBer

... DropDown์˜ ๋…ผ๋ฆฌ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฅผ ๋ฌด์–ธ๊ฐ€์— ์ฒจ๋ถ€ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(Dropdown.open()) ์ผ๋ถ€ ์œ„์ ฏ์— ์ž์‹์œผ๋กœ ์ถ”๊ฐ€ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ...

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