dポイントプレゼントキャンペーン実施中!

「教えて!goo」は初めてなので、質問の仕方等、違和感があるかもしれませんがよろしくお願いします。

class Menu(Widget):
****"""Menu widget which allows displaying menu bars, pull-down menus and pop-up menus."""
****def __init__(self, master=None, cnf={}, **kw): #①
******* """Construct menu widget with the parent MASTER.


********Valid resource names: activebackground, activeborderwidth,
********activeforeground, background, bd, bg, borderwidth, cursor,
********disabledforeground, fg, font, foreground, postcommand, relief,
********selectcolor, takefocus, tearoff, tearoffcommand, title, type."""
********Widget.__init__(self, master, 'menu', cnf, kw) #②

上記は
https://github.com/python/cpython/blob/master/Li …
の中の2853行目から始まる記述なのですが、

①【master, cnf, kwはそれぞれ何を表しているのでしょうか?】

②'menu'には Valid resource names: の中に含まれる単語たちを指定するのだと思いますが、
「tearoff=False(←親切な回答者様に教わったもの)」
このように「=False(もしくは=Trueかな?)」を指定しています。
【「FalseまたはTrueを指定する」というルールは何を見て判断しているのでしょうか?】

よろしくお願いいたします。

質問者からの補足コメント

  • うーん・・・

    回答ありがとうございます。

    知識が足りず、3割程度しか理解できませんでした。

    以下のコードのどこがどこに対応しているのか教えていただけると幸いです。

    No.1の回答に寄せられた補足コメントです。 補足日時:2017/09/24 11:33
  • うーん・・・

    import tkinter as tk

    root=tk.Tk()

    #メニュー
    menubar=tk.Menu(root)
    root.configure(menu=menubar)


    #メニューバーの設定
    file=tk.Menu(menubar,tearoff=False)
    edit=tk.Menu(menubar,tearoff=False)
    menubar.add_cascade(label="File",underline=0,menu=file)
    menubar.add_cascade(label="Edit",underline=0,menu=edit)

    root.mainloop()


    rootがWidgetで?
    Tk()がBaseWidget?
    いや絶対違うと思うのですが、よくわかりません…

      補足日時:2017/09/24 11:37
  • 回答ありがとうございます。

    >>tkinterモジュールの中を詳細に知りたいのなら、その前に、Pythonの中級以上の理解と、オブジェクト指向(と、それをPythonでどう実現しているか)の理解も必要です。

    モジュールの中を詳細に知るための知識をつけたいです。なのでPythonの中級以上になるための知識やオブジェクト指向(というのが何なのかもわたってないので)を理解するための知識をつけたいです。

    >>それぞれの詳細な設定を行い

    それぞれの詳細な設定をするための知識が無いので、サンプルコードを用いて、各記述がどういう意味を持っているのか・どのようなルールで記述されているのかを教えていただきたいと考えてます。

    No.2の回答に寄せられた補足コメントです。 補足日時:2017/09/24 18:32

A 回答 (4件)

ああ、もう一つ参考情報を。



Tkinterじゃないんですが、次のページにwxWidgetsの基本的な使い方が書いてあって、Pythonでも応用出来ます。

wxWidgets でクロスプラットフォーム GUIアプリを作ろう:
http://0xcc.net/pub/uu-2004-08/

これはC++での解説なんですが、キモは紹介されてる「wxGlade」と言う、やっぱりGUI Builderで、コイツもPythonコードを吐くんで、それを利用してwxWidgetsを使ったGUIのアプリが作成可能です。

参考までに。
    • good
    • 0

ちと横レス気味ですが。



Tcl/Tkってのを知っていますか?
Tcl/Tkってのは今は亡きSun Microsystemsがサポートしていた「GUIを簡易に組み立てる為の」スクリプト言語で、実はPythonとは全く関係ありません。
TkinterってのはPythonからTcl/Tkを呼び出す為のライブラリなんですね。つまり「Pythonと全く関係がない」言語処理系をPythonから呼び出せるようになっています。
従って、このGUI部分ってのは「Python極めても」要するに関係ない部分なんですよ(笑)。

一応、Pythonの場合、公式にはGUI処理には「枯れてる」Tcl/Tkを使うようになっています。
が。
実は別にTcl/Tkを使いたくない、って場合、色々とGUI用のライブラリがあっちこっちで開発されて公開されています。
代表的なトコだと、

・wxPython: https://wxpython.org/
・PyQt: https://riverbankcomputing.com/software/pyqt/intro
・PySide: https://wiki.qt.io/PySide

なんかがありますね。
どれもPythonから「GUI作成用のツールを呼び出す」ように作られていて、wxPythonはwxWidgets( https://www.wxwidgets.org/ )、残り2つはQt( https://www1.qt.io/jp/ )とやり取りします。

とまぁここまで能書きなんですが。
ぶっちゃけた話、「GUIを手書きでゴリゴリ書こう」ってのはメンド臭くてしゃーないんですよ(笑)。
んじゃあ実際はどーするのか?
実はGUI Builderって種類のアプリケーションがあるんですね。GUI Builderってのは、それこそGUIでマウスでボタンとか選んでペタペタ貼っていく、Visual Basic等でお馴染みの「GUI作成ツール」です。
つまり、GUIの部分はそうやって「マウスで」作っていって、それが自動作成したファイルを「Python側で呼び出す」ってのがトレンディ(死語)なやり方なんです。

Tkinterの場合、調べてみたカンジ、最も簡単に導入出来るのがPygubu( https://github.com/alejandroautalan/pygubu )と言うツールです。YouTubeでGUIの作成法なんかを公開してるんで参考になるんじゃないかと思います。

Pygubu hello world program:


導入方法なんですが、Pythonにpip入ってるでしょうか?

Python の Windows へのインストールと pip の使い方:
http://yohshiy.blog.fc2.com/blog-entry-329.html

pipが入ってるなら

pip install pygubu

と言うコマンドで、pygubuが入手出来ます。Windowsの場合、

C:\Pythonインストールフォルダ\Scripts\pygubu-designer.bat

を起動すればPygubuが立ち上がります。

他にも、Tkinter用にはPAGE( http://page.sourceforge.net/ )と言うGUI Builderもあって、こっちは試してないんですが、YouTubeに使い方ガイドが挙げられたりしてて、これはこれで高機能の模様です。

PAGE Generator Python - Tkinter GUI Builder:
https://www.youtube.com/watch?v=oULe0h0Jl3g

参考までに。
    • good
    • 0

○あなたが、本当に知りたいことは何ですか?


○あなたは、Tkの仕組みをどれくらい理解していますか?
○あなたは、Pythonの仕組みをどれくらい理解していますか?

このプログラムの動作を知りたいなら、
・Tkinterでウインドウや部品(ウィジェット)をどうやって配置させ、どうやって設定するか、の仕組み
・Pythonの基礎
が必要ですが、
・Tkinterの中身
は不要です。


root=tk.Tk()
 は、
tk.Tkクラス (→ import で、tk はtkinterを指している) のオブジェクトを作ってrootという変数に納める
 です。
tkinter.Tkクラスが中で何やっているか、そんなの気にする必要はありません。
大事なのは、これで、rootにTkの一番基礎になるウィンドウが用意されて、そこにいろんな部品を配置したりできるようになる、ということです。
続いて、 rootに、Menuウィジェットのmenubarを配置、menubarにはMenuウィジェットのfileとMenuウィジェットのeditを配置、それぞれの詳細な設定を行い、
root.mainloop()で実際の表示と、動作待ちのループになります。




tkinterモジュールの中を詳細に知りたいのなら、その前に、Pythonの中級以上の理解と、オブジェクト指向(と、それをPythonでどう実現しているか)の理解も必要です。
この回答への補足あり
    • good
    • 0

https://docs.python.jp/3/glossary.html#term-argu …
引数の渡し方には2種類あります。
・順番で指定する「位置引数」
・キーワード=値 の形で指定する「キーワード引数」

それを受け取る方も
・指定された位置に対応した値を受けとるもの
 =で指定が無かったときのデフォルト値を指定できる。
 キーワード引数としても受け取り可能
  このinitの場合、master, cnf の2引数が、1番目、2番目の位置引数を受けとる
  master=XXX とキーワード引数でも受け取れる
・↑で受け取れなかった位置引数を受け取るもの
 *を付けて指定する。このinitには該当無し
・defの引数リストに存在しないキーワード引数を受け取るもの
 ** を付けて指定する。
 {キーワード: 値} の辞書型になる。
 kw が該当。

の3種類があります。



① ここにある文章からだけでは判断できません。
 マニュアルを見てください。

https://infohost.nmt.edu/tcc/help/pubs/tkinter/w …
> o create a menu widget, you must first have created a Menubutton, which we will call mb:
> w = tk.Menu(mb, option, ...)

や、他の記述からすると、次のようになります。
master: 親ウィジェットを指定する
cnf: 辞書型にしたオプションを受けとる
kw: キーワード引数で指定されたオプションを受け取るための辞書


> 'menu'には Valid resource names: の中に含まれる単語たちを指定するのだと思いますが

違います。

Menuクラスの親クラス Widget のコンストラクタへと渡されています。
これは、Widgetの親クラス BaseWidgetのコンストラクを呼び出すことになります。
2280行目からの
def __init__(self, master, widgetName, cnf={}, kw={}, extra=()):
"""Construct a widget with the parent widget MASTER, a name WIDGETNAME
and appropriate options."""
を見れば
Menu.__init__の self→BaseWidget.__init__のself
Menu.__init__の master→BaseWidget.__init__のmaster
'menu' →BaseWidget.__init__のwidgetName
Menu.__init__の cnf→BaseWidget.__init__のcnf
Menu.__init__の kw→BaseWidget.__init__のkw
BaseWidget.__init__のextraは指定無し
と対応していることがわかります。

'menu' は、WidgetName として指定するものです。
他のウィジェットの定義から判断するに、ウィジェットの種類をあらわすものです。
ここを変えると、Menuウィジェットではなくなってしまいます。


Valid resource names は オプションとして有効なものです。
tearoff=False
と指定したなら、 kw={'tearoff':False} と、引数kwで受けとることになります。

どんなオプションが使えて、何が有効な値か、は先程のマニュアルに書いてあります。
マニュアルにはtearoff は1か0と書いてありますが、True=1,False=0として動作するのでしょう。
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!