• 締切済み

python 絵をかいた後、inputを行いたい

現在pythonの勉強を行っています。 Tkで線を引いた後、inputで指定した場所に絵をさらに追加したいのですが、 絵が描かれずに先にinputがでてしまってどうしたらよいか困っています。 下記のようなプログラムを今書いており(○×ゲームにしたい)、 どこを直したらよいかわかりません。 どうかご教授お願いします。 from Tkinter import * root = Tk() c0 = Canvas(root, width = 200, height = 200) c0.create_line(10, 70, 190, 70) c0.create_line(10, 130, 190, 130) c0.create_line(70, 10, 70, 190) c0.create_line(130, 10, 130, 190) c0.pack() for Y in range(9): a = input("どこに置く?: ") if Y%2==0: id = c0.create_oval(10+(60*a/3), 10+(60*a/3),70+(60*a/3) , 70+(60*a/3)) c0.pack() root.mainloop()

みんなの回答

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

ここだとインデントが消えてしまうので、Pythonのコード書くときは、全角スペースとか適当な記号(_だの>だの)で置き換えるとかしないと意味が通じないので注意しましょう。 Tkinterに限らず、大抵のGUIのプログラムは、無限ループを作って、その中で入力を受け付けたり、画面を表示したりします。 TKinterではmainloopメソッドがそのループ実行にあたります。 mainloopを実行しないと、画面表示は行われません。 Tkinterを使ったGUIのプログラムで、文字列入力をしたいのなら、Pythonのinputは使わずに、Entryなどのウィジェットを使うのが普通だと思います。

  • struct
  • ベストアンサー率72% (32/44)
回答No.1

質問の意味がよくわからないので 適当に書いちゃいました。 ごめんね。 from Tkinter import * root = Tk() c0 = Canvas(root, width = 200, height = 200) c0.create_line(10, 70, 190, 70) c0.create_line(10, 130, 190, 130) c0.create_line(70, 10, 70, 190) c0.create_line(130, 10, 130, 190) c0.pack() def onclick(event): ___ x1 = (event.x - 10) / 60 * 60 + 15 ___ x2 = x1 + 50 ___ y1 = (event.y - 10) / 60 * 60 + 15 ___ y2 = y1 + 50 ___ # 左クリックで○ ___ if event.num == 1: _______ c0.create_oval(x1, y1, x2, y2, width=2) ___ # 右クリックで× ___ elif event.num == 3: _______ c0.create_line(x1, y1, x2, y2, width=2) _______ c0.create_line(x1, y2, x2, y1, width=2) c0.bind("<Button>", onclick) root.mainloop() サイトの仕様で先頭のスペースが吹き飛ばないよう インデントを _ に置き換えておいたから注意してね。

関連するQ&A

  • Pythonでキーが押されたことを判定したい

    Python初心者です。Pythonでキー入力の値を変数keyとして取り出したいのですが、上手くいきません。 グローバル関数がわかっていないのかと思いますが直し方がわかりません。 最終的に37行目のprint(key)でkeyの値を取り出したいのですがどうすればよいですか。 # -*- coding: utf8 -*- import tkinter as tk import winsound root = tk.Tk() frame = tk.Canvas(root, width=800, height=600) pimg = tk.PhotoImage(file="wall.png") frame.place(x=0, y=0) frame.create_image(400, 300, image=pimg) imgA = tk.PhotoImage(file = 'pressed_A.png') imgB = tk.PhotoImage(file = 'Pressed_B.png') def keyA(event): global key key="A" frame.place(x=0, y=0) frame.create_image(320, 220, image=imgA, tag="illust") root.update() winsound.PlaySound("pressed_A.wav", winsound.SND_FILENAME) def keyB(event): global key key="B" frame.place(x=0, y=0) frame.create_image(320, 220, image=imgB, tag="illust") root.update() winsound.PlaySound("pressed_B.wav", winsound.SND_FILENAME) frame.bind("a", keyA) frame.focus_set() frame.pack() frame.bind("b", keyB) frame.focus_set() frame.pack() print(key) root.mainloop()

  • Pythonコードの間違いを指摘して

    import tkinter as tk i=0 def a(): global i i=1 root=tk.TK() root.geometry("100x100") a() label=tk.Label(root,text=i) label.grid() tk.mainloop() →できた import tkinter as tk i=0 def a(): global i i=1 root=tk.TK() root.geometry("100x100") label=tk.Label(root,text=i) label.grid() button=tk.Button(root,text="button",command=a) button.grid() tk.mainloop() →できない(0と表示される)

  • 作成するデスクトップアプリのzip化がしたい。

    まだ作成途中ですがこれをデスクトップアプリにしてzip化をしたいと思っています。 import tkinter root = tkinter.Tk() root.mainloop() しかし、pip install pyinstallerでインストールしようとしてもこのようなエラーが出てしまいます。どうすればいいですか。 PS C:\作業用Python> & C:/Users/user/anaconda3/python.exe c:/作業用Python/HelloWorld/install.py File "c:\作業用Python\HelloWorld\install.py", line 1 pip install pyinstaller ^^^^^^^ SyntaxError: invalid syntax PS C:\作業用Python>

  • Pythonボタンを押したら〇行目に行く

    Python でTkinterを用い、ボタンを押したら、100行目以下へ行く、みたいなことはできないのでしょうか。以前何かプログラムを勉強してた時そういったのがあったように思ったのですが。 あるプログラムの真ん中ぐらいで、いったん止めて、ボタンを表示させ、ボタンを押したら、それ以降を実行するようにしたいです。 通常、ボタンを押したら、ボタンの関数を実行する形にするようです。それでいくと、私の状況だと、ボタンの関数に、後半を全て入れてしまわないといけないようになります。そうしないといけないのでしょうか。 root.mainloop() は、ボタンを表示させて確認したい、その真ん中あたりに置くというのでよいのでしょうか。ボタンを押したら、root.mainloop() より下のプログラムを進めるようにしたいです。

  • PythonでSetWindowPosを使うにはどうしたら良いでしょうか?

    少し前から、Tkinterを使って居りウィンドウを常に最前面に表示したいと思い立ちwin32guiとwin32conと言うモジュールが必要で、インポートするところまで辿り着いたのは良いのですが、その後がよくわかりません。 実験的に from Tkinter import * import win32gui,win32con root = Tk() win32gui.SetWindowPos(root,win32con.HWND_TOPMOST,0,0,200,150,win32con.SWP_SHOWWINDOW) root.mainloop() のようなコードを実行してみたのですが以下のようなエラーメッセージが帰ってきます。 Traceback (most recent call last): File "C:\Documents and Settings\PC USER\デスクトップ\Python\q2.py", line 9, in -toplevel- win32gui.SetWindowPos(root,win32con.HWND_TOPMOST,1,1,100,50,win32con.SWP_SHOWWINDOW) AttributeError: Tk instance has no attribute '__int__' 引数の与え方もいろいろなサイトの切れ端を集めたような感じで書いてしまったのでそもそもの書き方が違っているのかもしれません。 私の検索が不足なのは重々承知ですが、よろしければ実際にはどのように書けばウィンドウを最前面に出すことができるのかと、エラーメッセージの具体的な意味を教えて欲しいです。お願いします。

  • tkinterでボタンの幅をそろえたい

    お世話になります。 python 3.3.5とtkinterで勉強中です。 下記のようにtkinterでボタンを複数個横並びに配置したいのですがボタンの幅や高さを任意に設定する方法が解りません。 パッカーをつかっていて height=10 などとするとエラーになってしまいます。 import tkinter as tk def main(): w1=tk.Tk() # ボタンの幅をそろえる方法が解らない... btn1=tk.Button(w1, text=u"ボタン-1").pack(side=tk.LEFT, padx=5, pady=10) btn2=tk.Button(w1, text=u"ボタン--2").pack(side=tk.LEFT, padx=5, pady=10) btn3=tk.Button(w1, text=u"ボタン---3").pack(side=tk.LEFT, padx=5, pady=10) w1.mainloop() if __name__ == '__main__': main() どうしたらできるのでしょうか? よろしくお願いします。

  • Pythonコードの間違いを指摘して

    import tkinter as tk lastplay="" def gamestart(): global lastplay lastplay="試合開始" frame_main.tkraise() root=tk.Tk() frame_settings=tk.Frame(root) frame_settings.grid() button_gamestart=tk.Button(frame_settings,command=gamestart) button_gamestart.grid() fraim_main=tk.Frame(root) fraim_main.grid() label_1=tk.Label(frame_main,text=f"{lastplay}です") label_1.grid() fraim_settings.tkraise() root.mainloop() エラー内容 frame_mainが表示されたとき、変数の「試合開始」が表示されず、「です」のみ表示される。

  • python __del__()に関して

    「Programming Python 4th Edition」(O'REILLY) P.466に 以下のコードを実行すると 本来tmp.set(5)で6番目のRadiobuttonが選択された状態で初回表示されるはずだが radio1()終了時にtmp.__del__()が呼ばれて tmpに保持されている値がunsetされることにより Radiobuttonの初回表示が狂う (global行のコメントアウトをやめると正しく動作するようになる) といったことが書いてあり、実際にコードを実行すると確かにそのようになるのですが tmp.__del__()が呼び出される理由が理解できません。 __del__()が呼び出されるのはオブジェクトへの参照がなくなった時であって tmpの値(IntVarオブジェクト)はRadiobuttonのコンストラクタに渡されており、Radiobuttonオブジェクト内部で参照され続けるので、__del__()が呼ばれることはないはずだ、と素人考えでは思えるのですが。 お分かりになる方が居らっしゃればどうか教えて下さい。 ------------------------------------------------------------ from tkinter import * root = Tk() def radio1(): >>>>#global tmp >>>>tmp = IntVar() >>>>for i in range(10): >>>>>>>>rad = Radiobutton(root, text=str(i), value=i, variable=tmp) >>>>>>>>rad.pack(side=LEFT) >>>>tmp.set(5) radio1() root.mainloop() (>>>>は空白に読み替えてください)

  • centos6 python2.7 SCL

    centos6.10を使用 pythonのバージョンは2.6.6です python 2.7を一時的に利用しようと思って https://hondou.homedns.org/pukiwiki/index.php?Sakura%20CentOS6%20%A4%C7%20SCL%20%A4%F2%BB%C8%A4%C3%A4%C6%20Python2.7%20%A4%F2%BB%C8%A4%A6 こちらのサイトを参考にしたのですが ルートユーザーではpython2.6.6のまま変わらない状態で困っています。 一般ユーザーではpython2.7.13になる事ができました。 ルートで使用するにはどうしたらいいでしょうか? サーバーの再起動などはしてみましたが変化はありませんでした。

  • 14行目がおかしい?

    いつもお世話になりありがとうございます。 下記プログラムにてタイトルの通り、メッセージが出ます。 どうおかしいのでしょうか? ご回答のほど宜しくお願い申し上げます。 from cgitb import text import tkinter window = tkinter.Tk() window.title('足し算') window.minsize(400,400) Entry1=tkinter.Entry(font=("ゴシック",20),width=5,bg='blue') Entry1.place(x=30,y=65) textplace=tkinter.Label(font=("ゴシック",20),text='+') textplace.place(x=120,y=65) Entry2=tkinter.Entry(font=("ゴシック",20),width=5,bg='blue') Entry2.place(x=160,y=65) text2=tkinter.Label(font=("ゴシック",20),text='=') text2.place(x=250,y=65) kotae_text=tkinter.Label(text"",font=("ゴシック",20)) kotae_text.place(x=300,y=65) button=tkinter.Button(text='結果は?',font=("ゴシック",20),bk='blue',activebackground="blue") button.place(x=150,y=150) def kekka(): suuji1=Entry1.get() suuji1=int(suuji1) suuji2=Entry2.get() suuji2=int(suuji2) kotae_text['text']=suuji1+suuji2 button['command']=kekka window.mainloop()