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

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

ただいまの
回答率

87.60%

ラジオボタンをクラスに入れたい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,371

score 12

pythonを始めたばかりの初心者です。Tkinterを使いシステ厶を作っています。
ラジオボタンとスライダーを別々の製作したのですが、この2つを1つにまとめることが出来ません。クラスの構成がいまいちよく理解しておりませんので、その点でつまずいております。自分なりに色々調べてみましたが解決出来る自信がありませんのでご質問させていただきました。勉強不足&初歩的な質問で申し訳ありませんがアドバイスをよろしくおねがいいたします。
button_Ru=tk.Radiobutton(value=0,bg='#6499ef').grid(column=1, row=2, padx=(45,30),pady=(45,8))
tk.Label(text="Run",fg="white",bg="#014cc4",font=("",13,"bold")).grid(column=1, row=3, padx=(10,5),pady=(5,5))

button_Re=tk.Radiobutton(value=1,bg='#6499ef').grid(column=2, row=2,padx=(30,30), pady=(45,8))
tk.Label(text="Record",fg="white",bg="#014cc4",font=("",13,"bold")).grid(column=2, row=3, padx=(0,5),pady=(5,5))

button_P=tk.Radiobutton(value=2,bg='#6499ef').grid(column=3, row=2, padx=(25,30),  pady=(45,8))
tk.Label(text="Program",fg="white",bg="#014cc4",font=("",13,"bold")).grid(column=3, row=3,padx=(0,5),pady=(5,5))

上記のコードを下記のクラスに入れたいのですが自分なりにコードを入れてみてもボタンが表示されません。

import tkinter as tk
import tkinter
from tkinter import *
from tkinter import font

root = tk.Tk()
root.title("screen2")
root.geometry("320x240")
root.configure(width = 320, height=240,bg='#014cc4')
frame = tk.Frame(root)

class Application(Frame): 
def init(self, master): 
Frame.init(self, master) 
self.grid() 
self.create_widgets() 

class Ex(Frame):

def init(self, *args):
super().init(*args)
Pack.config(self)
self.createWidgets()      

def createWidgets(self):

self.slider = Scale(
self,
name = "slider",
from_ = -30, to =30 ,
orient = HORIZONTAL,
length = "8cm",
label = "Slider",
command = self.update,

)
for name, text, command in [
("minButton"  , '|<'  , self.reset_min ),
("leftButton" , '<<'  , self.skip_left ),
("rightButton", '>>'  , self.skip_right),
("maxButton"  , '>|'  , self.reset_max ),
("quitButton" , 'Set', self.quit      ),
]:
setattr(self, name, Button(
self,
name = name,
text = text,
command = command,
))

self.grid(pady=(150,0),padx=(5,0))
self.slider.pack(side=TOP)
self.minButton.pack(padx=(30,5),side = LEFT)
self.leftButton.pack(padx=(0,5),side = LEFT)
self.rightButton.pack(padx=(0,5),side = LEFT)
self.maxButton.pack(padx=(0,5),side = LEFT)
self.quitButton.pack(padx=(0,10),side = LEFT)

def update(self, val):
self.slider["label"] = "Slider value: %s"%val

def min(self):
return self.slider["from"]

def max(self):
return self.slider["to"]

def value(self):
return self.slider.get()

def reset_min(self):
value = self.min()
self.slider.set(value)

def skip_left(self):
value = max(self.value()-5, self.min())
self.slider.set(value)

def skip_right(self):
value = min(self.value()+5, self.max())
self.slider.set(value)

def reset_max(self):
value = self.max()
self.slider.set(value)

----------------------------------------

def example(*args):
ex = Ex()
ex.mainloop()

----------------------------------------

if name=='main':
example()
root.mainloop()

ここに言語を入力
コード
```

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • firedfly

    2019/02/08 10:11

    コードすべてを載せて頂けるのは非常にありがたいです。
    が、長いコードすべてを読まないと回答できないのは辛いものがあります。
    質問者の意図を探るのも、問題の原因を考えるのも、正解を構築するのも、長いほど大変になるので。

    キャンセル

  • wwbQzhMkhhgEmhU

    2019/02/08 12:03

    初心者と言ってる人に整理を促すのはともかく、短いコードを要求するのはどうかと思います。
    コピペでそのまま動作確認できるのがベストなので、貼れる限り長いコードで全然問題ありません。
    そんなことより、コードの内容を選択して、上部バーcodeボタンを使ってインデントを残してください。
    インデントが違っていると動かないので。

    キャンセル

  • firedfly

    2019/02/09 00:34

    もう少し自分で整理できないと
    答えを教えても理解できなかろうと思ったのですが、
    ちょっと高望みしすぎでしたかね……。

    キャンセル

回答 1

checkベストアンサー

+2

単に2つのサンプルコードを持ってきた感じですかね。

ちょっとみてみましたが

  • ラジオボタン側は手続き型で書かれており、スライダー側はクラスを使って書かれている
  • ラジオボタン側はレイアウトマネージャーにgrid()を使っており、スライダー側はpack()を使っている。

等などあり、本来であればどのような方向性でマージしたいのかを決める必要がありそうですが、とりあえず

  • クラスを使用
  • レイアウトマネージャは grid() を使用

にてマージしてみました。
できるだけ難しそうな記述は避け必要最低限のコードになるようにしましたので参考にしてみてください。

import tkinter as tk
from tkinter import font

class Application(tk.Frame):
    def __init__(self, master):
        super().__init__(master)
        self.pack()
        self.createWidgets()

    def createWidgets(self):
        ### 各Widgetを生成 ###

        # ラジオボタンを生成
        self.button_Ru = tk.Radiobutton(self, value=0)
        self.button_Re = tk.Radiobutton(self, value=1)
        self.button_P = tk.Radiobutton(self, value=2)
        # ラジオボタン用のラベルを生成
        self.label_Ru = tk.Label(self, text="Run", font=("", 13, "bold"))
        self.label_Re = tk.Label(self, text="Record", font=("", 13, "bold"))
        self.label_P = tk.Label(self, text="Program", font=("",13,"bold"))
        # スライダーを生成
        self.slider = tk.Scale(self, from_=-30, to=30, orient=tk.HORIZONTAL, length="8cm", label="Slider", command=self.update)
        # スライダー制御用ボタンを生成
        self.minButton = tk.Button(self, text='|<', command=self.reset_min)
        self.leftButton = tk.Button(self, text='<<', command=self.skip_left)
        self.rightButton = tk.Button(self, text='>>', command=self.skip_right)
        self.maxButton = tk.Button(self, text='>|', command=self.reset_max)
        self.quitButton = tk.Button(self, text='Set', command=self.quit)

        ### 各Widgetsを配置 ###
        # 各Widgetを(4行、5列)のグリッドのどの位置に配置するかを記述

        # ラジオボタンを配置
        self.button_Ru.grid(row=0, column=0)
        self.button_Re.grid(row=0, column=2)
        self.button_P.grid(row=0, column=4)
        # ラジオボタン用のラベルを配置
        self.label_Ru.grid(row=1, column=0)
        self.label_Re.grid(row=1, column=2)
        self.label_P.grid(row=1, column=4)
        # スライダーを配置
        self.slider.grid(row=2, column=0, columnspan=5, sticky='NSEW')
        # スライダー制御用ボタンを配置
        self.minButton.grid(row=3, column=0, sticky='NSEW')
        self.leftButton.grid(row=3, column=1, sticky='NSEW')
        self.rightButton.grid(row=3, column=2, sticky='NSEW')
        self.maxButton.grid(row=3, column=3, sticky='NSEW')
        self.quitButton.grid(row=3, column=4, sticky='NSEW')

    def update(self, val):
        self.slider["label"] = "Slider value: %s"%val

    def min(self):
        return self.slider["from"]

    def max(self):
        return self.slider["to"]

    def value(self):
        return self.slider.get()

    def reset_min(self):
        value = self.min()
        self.slider.set(value)

    def skip_left(self):
        value = max(self.value()-5, self.min())
        self.slider.set(value)

    def skip_right(self):
        value = min(self.value()+5, self.max())
        self.slider.set(value)

    def reset_max(self):
        value = self.max()
        self.slider.set(value)

if __name__=='__main__':
    root = tk.Tk()
    root.title("screen2")
    root.geometry("320x240")
    root.configure(width = 320, height=240 ,bg='#014cc4')
    app = Application(root)
    app.mainloop()

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/08 17:11

    わかりやすくまとめていただきありがとうございました。

    キャンセル

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

  • ただいまの回答率 87.60%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る