質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1873閲覧

tkinterで.packのエラー

kinopi

総合スコア16

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/07/29 07:21

tkinterの画面の切り替えを学習していたのですが謎のエラーが出ました。
サイトからコピペしたコードではエラーは出ないのですが自分で写しながら書いたコードのみエラーが出ました。

エラーメッセージ
Traceback (most recent call last):
File "ファイル名", line 30, in <module>
bt_gomarubatu.pack()
File "/Users/  /opt/anaconda3/lib/python3.8/tkinter/init.py", line 2387, in pack_configure
self.tk.call(
_tkinter.TclError: cannot use geometry manager pack inside . which already has slaves managed by grid

因みにこの行を消してみたところ次のbt_backhome.pack()でも同じエラーが出てその行も消すと正常に動きました。

自分で写しながら書いたコードはホーム画面とゲーム画面を切り替えるためのもので関数名やウィジェットの名前などを元のコードから変えました。
自分が写しながら書いたコード↓

python

1#!/usr/bin/env python 2# -*- coding: utf8 -*- 3import tkinter as tk 4import tkinter.ttk as ttk 5 6def gomarubatu(): 7 frame_marubatu.tkraise() 8 9 10def gohome(): 11 frame_main.tkraise() 12 13 14if __name__ == "__main__": 15 #メインウィンドウの設定 16 root = tk.Tk() 17 root.title("home") 18 root.geometry("300x150") 19 #メインウィンドウのグリッドを1x1にする 20 root.grid_rowconfigure(0, weight=1) 21 root.grid_columnconfigure(0, weight=1) 22 #フレームの作成と設置 23 frame_main = ttk.Frame(root) 24 frame_main.grid(row=0, column=0, sticky="nsew", pady=20) 25 26 #メインウィンドウのウィジェットの設定と配置 27 lb_home = ttk.Label(frame_main, text="HOME") 28 bt_gomarubatu = ttk.Button(text="まるばつゲーム", command=gomarubatu) 29 lb_home.pack() 30 bt_gomarubatu.pack() 31 32 #まるばつフレームの作成と設置 33 frame_marubatu = ttk.Frame(root) 34 frame_marubatu.grid(row=0, column=0, sticky="nsew", pady=20) 35 36 #まるばつウィンドウのウィジェットの設置と設定 37 lb_marubatu = ttk.Label(frame_marubatu, text="まるばつゲーム") 38 bt_backhome = ttk.Button(text="メインに戻る", command=gohome) 39 lb_marubatu.pack() 40 bt_backhome.pack() 41 42 #メインフレームを全面にする 43 frame_main.tkraise() 44 45 root.mainloop()

元のコード↓

python

1# tkinterのインポート 2import tkinter as tk 3import tkinter.ttk as ttk 4 5def change_app(): 6 frame_app.tkraise() 7 8def change_main(): 9 frame.tkraise() 10 11if __name__ == "__main__": 12 # rootメインウィンドウの設定 13 root = tk.Tk() 14 root.title("tkinter application") 15 root.geometry("300x150") 16 17 # rootメインウィンドウのグリッドを 1x1 にする 18 root.grid_rowconfigure(0, weight=1) 19 root.grid_columnconfigure(0, weight=1) 20 21 22 # メインフレームの作成と設置 23 frame = ttk.Frame(root) 24 frame.grid(row=0, column=0, sticky="nsew", pady=20) 25 26 # 各種ウィジェットの作成 27 label1_frame = ttk.Label(frame, text="メインウィンドウ") 28 entry1_frame = ttk.Entry(frame) 29 button_change = ttk.Button(frame, text="アプリウィンドウに移動", command=change_app) 30 31 # 各種ウィジェットの設置 32 label1_frame.pack() 33 entry1_frame.pack() 34 button_change.pack() 35 36 # アプリフレームの作成と設置 37 frame_app = ttk.Frame(root) 38 frame_app.grid(row=0, column=0, sticky="nsew", pady=20) 39 40 # 各種ウィジェットの作成 41 label1_frame_app = ttk.Label(frame_app, text="アプリウィンドウ") 42 entry1_frame_app = ttk.Entry(frame_app) 43 button_change_frame_app = ttk.Button(frame_app, text="メインウィンドウに移動", command=change_main) 44 45 # 各種ウィジェットの設置 46 label1_frame_app.pack() 47 entry1_frame_app.pack() 48 button_change_frame_app.pack() 49 50 # frameを前面にする 51 frame.tkraise() 52 53 root.mainloop()

参考にしたサイト

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

エラーの内容は、pack()/grid() は同一ウィジェット上に混在させることは出来ないというものです。
質問のケースでは、ウィジェットの親子関係が元コード通りになってません。

問題個所: 30, 40 行目の Button の第一引数

第一引数を省略した場合、デフォルトの親は root になってしまいます。
root 上のウィジェットは、既に grid() による配置が行われている為、
後から pack() で配置はエラーになります。

修正方法: 恐らく意図するウィジェットの親子構造は、フレーム上にボタンを載せたいはずなので、
ttk.Button の第一引数に適切なフレームを渡してください。

## ウィジェットの階層構造 # OK root frame_main.grid lb_home.pack bt_gomarubatu.pack frame_marubatu.grid lb_marubatu.pack bt_backhome.pack # NG # Button の親ウィジェットが省略時の root になっている為、 # root 上のウィジェットで pack/grid の混在が発生 root frame_main.grid lb_home.pack bt_gomarubatu.pack frame_marubatu.grid lb_marubatu.pack bt_backhome.pack

投稿2021/07/29 08:15

teamikl

総合スコア8664

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kinopi

2021/07/29 08:30

自分の確認不足でした。エラーが30行と40行に出ていたのでそこばかりみていました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問