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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Kivy

Kivyは、Pythonを用いたNUI開発のためのオープンソースフレームワーク。マルチタッチなど多くの入力に対応したNUIアプリなどを開発することができます。多くの環境で動作するクロスプラットフォームです。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Python

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

Q&A

解決済

2回答

1798閲覧

python、kivyでのレイアウトを変えたい

hiro04kon

総合スコア46

Kivy

Kivyは、Pythonを用いたNUI開発のためのオープンソースフレームワーク。マルチタッチなど多くの入力に対応したNUIアプリなどを開発することができます。多くの環境で動作するクロスプラットフォームです。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Python

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

0グッド

0クリップ

投稿2021/07/30 12:56

やりたいこと

pythonとkivyで、スマホアプリを作ろうとしています。
そして、kivyで書いたレイアウトの内容を、スマホで使いやすいように常に下に表示したいのです。
いろいろやってみて、Screenmanagerで画面の切り替えをできるようになったのですが、レイアウトがうまくできません。
画像のように、一番上にある**[[refresh] [Time] [取消!]]**の行を、一番下に表示したいです。
「class Nav」になにか工夫をすれば良いと思うのですが、どなたかお知恵を貸してください。
イメージ説明
pythonコード

python

1 2from kivy.app import App 3from kivy.uix.screenmanager import ScreenManager, Screen 4from kivy.uix.boxlayout import BoxLayout 5from kivy.uix.gridlayout import GridLayout 6from kivy.uix.button import Button 7from kivy.uix.label import Label 8from kivy.uix.spinner import Spinner 9from kivy.properties import StringProperty 10import japanize_kivy 11 12#ファイル名 13file = ["a","b","c"] 14 15###################################################################### 16class CustomSpinner(Spinner): 17 pass 18 19class MainScreen(Screen): 20 pass 21 22class Manager(ScreenManager): 23 def __init__(self): 24 super(Manager, self).__init__() 25 screen = Screen(name = 'Screen 1') 26 screen.add_widget(MainScreen(name='Screen 1')) 27 self.add_widget(screen) 28 base=Base('main') 29 self.add_widget(base) 30 31 def refresh(self): 32 self.clear_widgets(screens=[self.get_screen('main')]) 33 base=Base('main') 34 self.add_widget(base) 35 36class Nav(GridLayout): 37 def __init__(self,sm=None): 38 super(Nav, self).__init__() 39 self.sm = sm 40 self.cols =4 41 self.size_hint = (1,0.08) 42 43 def change(self, btn): 44 self.sm.current='main' 45 46 def goscreen(self,ins): 47 self.sm.current='Screen 1' 48 49class Base(Screen): 50 def __init__(self,name): 51 super(Base, self).__init__() 52 self.name=name 53 self.lay=GridLayout(cols = 3) 54 55 for i in range(10): 56 button = Button(text = "No." +str(i),on_press = self.click) 57 self.lay.add_widget(button) 58 self.add_widget(self.lay) 59 60 def click(self): 61 print("押しました") 62 63class Root(BoxLayout): 64 def __init__(self): 65 super(Root, self).__init__() 66 self.orientation = "vertical" 67 sm = Manager() 68 self.sm = sm 69 self.add_widget(Nav(sm=sm)) 70 self.add_widget(sm) 71 72class SampleApp(App): 73 def build(App): 74 return Root() 75 76if __name__ == '__main__': 77 SampleApp().run()

kvファイル(sample.kv)

kivy

1<MainScreen>: 2 BoxLayout: 3 orientation: 'vertical' 4 size: root.size 5 6 BoxLayout: 7 size_hint_y: 0.05 8 BoxLayout: 9 size_hint_y: 0.08 10 CustomSpinner: 11 text: 'ファイルを選択' 12 13 Label: 14 text: "←ファイルを選択" 15 Widget: 16 size_hint_x: 0.5 17 18<Nav>: 19 rows: 1 20 cols: 4 21 Button: 22 id:zaseki 23 text:"席表" 24 on_release: root.change(self) 25 Button: 26 text:"ファイル" 27 on_release: root.goscreen(self) 28 29<Root>: 30 BoxLayout: 31 orientation: 'horizontal' 32 size_hint: (1,0.08) 33 Button: 34 text:'refresh' 35 Label: 36 text: 'Time' 37 Button: 38 text: '取消!' 39

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

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

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

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

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

guest

回答2

0

公式の解説の何処で

python

1class Manager(ScreenManager): 2 def __init__(self): 3 super(Manager, self).__init__()

のように__init__()を上書きしていますか? 公式ではどれも

class Manager(ScreenManager): def __init__(self, **kwargs): super(Manager, self).__init__(**kwargs)

のように上書きしてませんか?

前回の質問でも言いましたがhiro04konさんは公式のやり方に沿ってないせいで、本来なら躓かなくてもいい所で躓いてしまっています。慣れるまでは公式docの作法に従ったほうが良いです。

他にもcodeにおかしなところは幾つかあるのですが、とりあえずwidgetは極力Kv言語側で作るようにした方が、widget階層が視覚的に分かりやすくなって良いです。以下のloopを使っている部分

for i in range(10): button = Button(text = "No." +str(i),on_press = self.click) self.lay.add_widget(button)

を除いた全てのwidgetはKv言語側で作るのがお薦めです。

投稿2021/08/09 10:39

gottadiveintopy

総合スコア736

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

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

0

自己解決

解決しました。当然ですが、下の列に移したいものを、新しいclassで読み込みました。
他にあれば、教えてほしいで。

python

python

1*最初は同じ 2 3class Nav(GridLayout): 4 def __init__(self,sm=None): 5 super(Nav, self).__init__() 6 self.sm = sm 7 self.size_hint = (1,0.1) 8 9class Base(Screen): 10   …省略 11 12 13class Root(BoxLayout): 14   …省略 15 16class Under(BoxLayout):  **#追加したところ** 17 pass 18 19*以下省略

KVファイル

kivy

1# File name: Screentest.py 2 3<MainScreen>: 4   …省略 5<Nav>: 6   …省略 7<Under>:   **#Rootから変更したところ** 8 size_hint_y: 0.1 9 BoxLayout: 10 orientation: 'horizontal' 11 Button: 12 text:'refresh' 13 Label: 14 text: 'Time' 15 Button: 16 text: '取消!' 17 18

投稿2021/08/02 05:21

hiro04kon

総合スコア46

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問