◎正当な理由による書き込みの削除について: 生島英之とみられる方へ:
【GUI】Fletスレ【Python/Flutter】
動画、画像抽出 ||
この掲示板へ
類似スレ
掲示板一覧 人気スレ 動画人気順
このスレへの固定リンク: http://5chb.net/r/tech/1737771850/
ヒント:5chスレのurlに http://xxxx.5chb.net/xxxx のようにbを入れるだけでここでスレ保存、閲覧できます。
Pythonだけで比較的省労力でGUIが作れて趣味プログラマレベルでもとっつきやすいFletについて語りませんか。
公式
https://flet.dev/ サンデープログラマレベルでもGUIに手を出せるのでありがたいけれど、いじっていてよく分からないところもあるので、質問できるスレとかがあるといいかなと思って立ててみた。
AutoComplete便利だけど、独立のコントロールになっているのはヘンじゃないかなぁ。TextFieldとかDropdownとかに統合されているべき機能のような気がする。
最近はこれつかってるなぁ
なんか2.6から自分でdart弄って拡張つくれるのかね
ドラックドロップないのが欠点だ
更新・再描画はPage.updateを明示的に呼ぶスタイルになっていて、それはそういう命令的なやり方をするという設計方針なんだろうから別にいいんだけど、肝心のupdateが変にスマートぶろうとして、変化があったと認識したコントロールしか更新・再描画してくれないんだよね。しかもその認識基準が結構ザルで、内容が変更されているのにupdateがそれを認識してくれないパターンが結構ある。flet.Control.build_update_commandsがたぶん更新・再描画するコントロールを選別するロジックなのかなと思うんだけど、読んでもよくわからなかった。
変にスマートぶろうとせず、コントロールを強制的に更新・再描画するメソッドを追加してくれないかなぁ。更新・再描画の手段がPage.updateしかない状況で、そのupdateがポンコツなのは辛すぎる。
使いやすいし、今後の発展にも期待しているんだけど、画面更新・再描画とか、画面遷移とか、そういう基本的なところの穴がまだ結構残っている印象かや。今後の改善に期待。
コントロールのハッシュ値が変化していればそのコントロールをupdate対象にするという処理にどうもなっているっぽくて、そうだとすれば、更新・再描画を要するような内容の変更があればハッシュ値も変わるようになっていないといけないはずなんだけど、必ずしもそうなっていないんじゃないかと思う。
updateはFlutterのsetStateの関係で呼ぶスタイルになっているのかなと思っている
flet.Refでコントロールツリーの途中への参照が持てるのね。便利
refは使ってないな
current付けるのが好きで無い
Refは、コントロールツリー全体の構造を保ったままその途中ノードに名前を付けるための機能と理解している。
なので、ある程度大きなコントロールツリーでないとありがたみが出てこないのは確かだよね。
DropdownのOptionのcontentプロパティに文字列以外のコントロールも入れられると知って、flet.Rowを入れたんだけど、valueプロパティ(Optionのkeyプロパティ)は(自分の誤解でなければ)文字列化されちゃうのね。keyプロパティにtupleとかsqlite3.Rowを代入しても文字列化されるという仕様はどうなんだろう。任意のコントロールを格納できるようにした意味がないような気もするが……。
全てはControlEventのdataがstr型に引っ張られているきがしている
これイベントハンドラが
スレッドプールから呼ばれてマルチスレッドになってんだよな
0.27が出ているみたい。Dropdownコントロールが置き換えで微妙に仕様が変わっているみたいね。
入力文字列に基づく絞り込み表示がされるようになったのは嬉しいけれど、どうせならsuggestionプロパティを追加する等してAutoComplete相当の機能も取り込んでくれないかな。
あと、DropdownOptionにcontent属性を指定していてる場合、選択時にドロップダウンボックス内に表示されるのが(content属性ではなく)key属性の内容になっている(0.26ではcontent属性の内容だった)。これが意図した仕様変更なら改悪なのでは。
他のコントロールの手前にコントロール表示を重ねること(オーバーレイ表示)ができるのって、Page.overlayに入れられるコントロール(AlertDialog等)か、そうでなければStackの中だけか。
普通のColumnとかがオーバーレイ表示できるオプションがあれば便利なんだけどなぁ。
expand: True と width をともに指定したときの挙動って、親コントロールがRow やColumnのときとそれ以外のときとでひょっとして異なる?(RowやColumnのときはexpand: Trueが優先されるのに対し、それ以外のときはwidth指定が優先される?)
本来的には親コントロールがRowやColumn以外のときにもexpandを指定できるのがおかしいのかもしれないけれど、そこを許容するのであれば、他の部分の仕様も合わせておいて欲しかった。
Page.on_keyboard_eventは、キー押しっぱなしのリピート入力には対応していないか。
TextFieldにフォーカスを当てたときにTextField内に文字列があったらそれを選択状態にするというのをやりたいんだけど、方法がわからない。わりとありがちなニーズだと思うんだけど、
そもそも、TextField内の文字列を選択状態にするというメソッドがないような……。
仮に、今は方法がないのだとしても、バージョンアップなどでそのうち対応しそうではあるけれど、現状だとまだできないのかな?
Viewを新規作成したときのアニメーションはあんまり要らないかな。設定で切り替えられるようになっていればいいのにとちょっと思う。
遷移変えたいならPageTransitionTheme
おお、そんなところで設定できたのね。Themeは見てなかったよ。
おお、そんなところで設定できたのね。Themeは見てなかったよ。
AlertDialogに「OK」「Cancel」のテキストボタンを置いて、それぞれを押したときの処理を書くという場合、テキストボタンのon_clickにlambdaで書ける内容なら苦労しないんだけど、文が必要なときはどうするのがいいかな?
今は、関数を作ってテキストボタンのon_clickに指定しているんだけど、わざわざ名前付きの関数を作らなきゃいけないのがちょっと不満なんだよね。よくあるGUIライブラリみたいに戻り値で分岐させる方が楽だったなという感が拭えなくて。
1か月くらい前に1.0アルファ版が出ていたのね。ちょっと触る時間がないんだけど、結構再設計されている部分があるみたい。
リアクティブプログラミングスタイルの記述が気になっているけど触っていない
レイアウト系コントロールのcontrolsプロパティに、たとえばRowとCheckboxとLiptViewを突っ込むと、VSCodeのPylanceから「型"list[Row | Checkbox | ListView]"の引数を、関数"__init__"の型"list[Control]" のパラメーター"controls"に割り当てることはできません」って警告が出て鬱陶しいんだけど正攻法で抑止する方法って何かないかな。
Row, Checkbox, ListViewがControlの下位クラスってことを型チェッカーが把握してないってことだと思うんだけど。
RowとCheckboxとListViewをすべてControlにcastすれば警告は抑止できるけど、さすがにそんなこといちいちやっていられないし。
たぶん何か簡単な方法があると思うんだけどなぁ。
昔それなったことあるけど
今単純にColumnのcontrolsにRow, Checkbox, ListViewを突っ込んだだけだとでないな
原因は一応分かったかも。
中のコントロールにflet.Refで参照を張っているんだけどどうやら角括弧による型付きRefで参照を張ると警告が出るっぽい。単にft.Ref() にしたら警告が出なくなった。ただ、動作に問題がないかは要確認かな。何でそうなるのかもまだきちんとは分かってないし。
ジェネリクスの共変とか反変とかの概念が関係あるみたいね、あまりよく分かってないが。基底型がBで派生型がDのとき、list[D]がlist[B]の派生型になるとは限らないとか何とか。本当は型理論とかまじめに勉強すべきなんだろうけど、それはちょっとしんどいなぁ……。
@data_viewにちょっと触ってみた。before_updateに色々突っ込まずに済むようになったみたいでそれ自体はいい感じ。
ただ、親コントロール.controls[インデックス] = 新コントロールという感じで更新するとき、インデックス(親コントロールの何番目の子要素か)をハードコーティングしたくないんだけど、あまりうまく行く方法が見つからなくて困り中。Refでやるのが普通かなと思ったんだけど、@data_viewはメモ化しているみたいで、キャッシュからコントロールが返されるときにうまくいかないみたい。
あまり触る時間もないので当面はハードコーティングで済ませて、ドキュメントが公開された後にあらためて検討することになりそう。
TextFieldを含むカスタムコントロールXと、その状態を保持するXStateクラスとを作ってControlBuilderでリアクティブに処理しようとする場合、とりあえずxにxstateへの参照を持たせて、TextFieldのon_changeの中で x.state.value = e.control.value みたいな感じにしているんだけど、こんな設計でいいのかな。これだと入力のたびにTextField(あるいはそれを含むカスタムコントロール全体?)が再生成されることになるんだけどリアクティブUIってそんなもの?
あまり、他のフレームワークとか触ったことがないので勝手がよくわからない。
ControlBuilderで生成されるコントロールが持つメソッド(具体的にはfocus)の呼び出しって、どう書けばいいんだろ?
controlsリストの最初の要素としてfocusを持つコントロールを生成して返すControlBuilderを置いた上で、他の場所でself.controls[0].focus って書いたら、「ControlBuilderはfocusという名前のメソッドを持ってない」と怒られたんだが。
dev5066いれてみたけどControlBuilderどこだよ…
>>38 ft.Refで参照したよ
で、TextField.focus()だと非同期になってるからawaitいる
ControlBuilderで返されるオブジェクトのrefプロパティに適宜のref名を設定して参照を張るという方法は、ControlBuilderに渡す状態オブジェクト変数が p → q → p …… というように同じ引数になる場合、同じ引数による2回目以降の呼び出しでは効かなくなるという問題がない? だから、ControlBuilderを使う場合にはrefは事実上、使えなくなったものだと思っていたんだが。
ControlBuilderをちょっと試してみたが、やっぱり少し重くなることがあるね。自分の書き方が悪いだけなのかもしれないけれど、そうでないとしたら使い所・使い方を選ぶ感じの機能なのかも。全面的にリアクティブUIにしたかったんだけど、これだとちょっと辛いかな。
>>38 妥当な方法か否かは分からないが、ControlBuilderの content属性からControlBuilderが生成したその戻り値オブジェクトにアクセスできるみたいね。
直接value触ると怒られるな
もうstateから触れってことか
>>45 ControlBuilderのcontent属性にセットされるのは一回updateされた後っぽい。それまではNone
ControlBuilderの仕様って、こんな感じ?
・ 画面にはControlBuilderの第2引数builderの呼び出しによって生成されたコントロールが表示されるが、コントロールツリーにはControlBuilderオブジェクトそのものが格納される。
・ ControlBuilderの第2引数builderの呼び出しによって生成されたコントロールは、いったん画面に表示された後は(?)、ControlBuilderオブジェクトの属性contentに保持されている(そうなる前のcontent属性の値はNone)。生成されたコントロールの属性にアクセスしたいときは、このcontent属性経由でアクセスすることが考えられる。
・ ControlBuilderの第1引数state(その実引数式)は、ControlBuilderの呼び出し時にただ1度だけ評価され、ControlBuilderは以下その値を参照し続ける。したがって、コントロールの仕様がstate.attrに依存する場合は、第1引数としてはstateを渡し、第2引数builderの式の中でstate.attrを参照する形にするのが基本。第1引数にstate.attrを直接渡す形にしてしまうと(それ自身が値の変更を行うメソッドを持っていたり、そもそも値の変更を行う必要がないような場合はともかく)どこかでstate.attr = new_val としてもControlBuilder から状態変更として認識されない。
・ 描画更新・再描画は、第1引数stateの内容変更(おそらくそのハッシュ値の変更?)があったときに、第2引数builderに第1引数stateを引数として与えて呼び出したその戻り値のコントロールを新しいコントロールとする形で行われる。builderは描画更新・再描画のたびに呼び出されるが、ControlBuilderやその第1引数stateは描画更新・再描画のたびに評価されるわけではない。
・ 第1引数stateの内容変更は描画更新・再描画のトリガーになるので、stateオブジェクトはできるだけコンパクトにするのが良い。
・ ControlBuilderで生成されるコントロールにref属性を設定するのは、第2引数builderに渡される状態引数(=第1引数stateの値)が p → q → p …… というように同じ値になる場合(CheckBoxやRadioGroupでよくある)、同じ値による2回目以降の呼び出しでは効かなくなるという問題があるっぽい(キャッシュが働くため、refを設定するコードがスキップされてしまうのだと思われる)。事実上、Refが使えないのだとすると非常に不便なので何か回避法がありそうではあるが……。
あれ、現時点でインストールするとControlBuilderが見つからないってなるな。
>>39-41と同じ状態?
StateViewという名前になったのか。こういう変更ってどこかに書いてあったのかな? アルファ版だから、どこにも書いてなかったとしても文句は言えないが。
>>48 4点目だけど、描画更新・再描画が行われるのは、第1引数stateの内容変更があったときではなく、第1引数stateの子孫属性に対する代入があったときというのが正確みたいね(元と同じ値を代入したときも描画更新・再描画は行われるみたい)。noteで解説記事を書いている人によると、__set_attr__をフックしているらしい。
せっかくupdateいらなくなるのに
asyncio.sleepがいるってどうなん……
page.run_taskでstate変更しても反映しないな
タブ周りも結構変わっているのね。Tabsのcontentに(Columnでまとめた)TabBarとTabBarViewを入れるってことでいいの……か?
>>48 最後の点だけど、もうRefを使っても問題ないみたい。修正された?
生成後に部分的な状態変更を必要とするようなカスタムコントロールは、StateViewでは使えないことになるのね。基本的にカスタムコントロールで凝ったことをするのは想定してないってことなのか。
アルファ版のうちにということだろうけど、ここぞとばかりに色々弄っているな。たしかにこの先破壊的変更は入れづらくなっていくんだろうから、ここでいろいろやっておくのは良いことなんだろうね。
lud20250917141932このスレへの固定リンク: http://5chb.net/r/tech/1737771850/
ヒント:5chスレのurlに http://xxxx.5chb.net/xxxx のようにbを入れるだけでここでスレ保存、閲覧できます。
TOPへ TOPへ
全掲示板一覧 この掲示板へ 人気スレ |
Youtube 動画
>50
>100
>200
>300
>500
>1000枚
新着画像
↓「【GUI】Fletスレ【Python/Flutter】 」を見た人も見ています:
・大学のC++の課題手伝ってほしいんです...
・★★Java質問・相談スレッド172★★
・iphone6とmacbookpro(2015)ってまだ現役?
・Visual Studio 2019 Part2
・Visual Studio 2019 Part5
・Google Cloud Platformでシステム開発
・くだすれFORTRAN(超初心者用)その7
・VB.NET質問スレ(Part43)
・Visual Studio Code / VSCode Part4
・日本語プログラミング言語Mind
・掲示板をapacheで外部公開したいです
・ノーコードが破綻。これからはRADツールの時代
・java初めてみたいんだがさっぱり分からん
・Java入門・初心者質問スレ Part.7
・今だからこそ2ch代替サービスの実装を考えるスレ
・C/C++のソースをRustへ全力で置き換えるスレ
・エビデンスは役に立たない。再現手順をもってこい。
・Udemyで教師やってたって全く自慢にならんよな?
・いじめっ子にお礼したい
・Visual Studio 2022 Part3
・【Scratch】メイクロックマン パート2
・5chプログラムテスト
・統計解析R たぶんpart3くらい
・Delphi/C++Builderが長い時を越えて再び無料に
・ブックマークレット【 JavaScript】
・Progateについて語れ
・プログラム板の姫になってもいいですか?
・【HSP】Hot Soup Processor総合スレ【part 11】
・俺のトリップを当ててみろ
・Windows Azure プログラミング 総合スレ2
・gPRCをおっぱじめる漢のスレ
・JS初心者の集まるスレ
・なぜ競プロ信者は遊びは遊びと割り切れないのか
・自分中2だけど、今から言語勉強すれば稼げるかな
・Git 19
・各言語の記法と用語の変換スレ
・COBOL?極めてやんよ シュッシュ!!
・Android Studio 2
・Boost C++ Libraries Sandbox
・インタープリター言語スレ。
・★初心者以前の質問に雪崩のように答えるスレ 3★
・くだすれDelphi(超初心者用)その58【Embarcadero】
・文字コードの種類は何故複数あるのでしょうか?
・【分散型バージョン管理】 Mercurial 2【hg】
・ビッグデータを活用しても新しいことはわからない
・アプレットとは何だったのか?
・Android開発質問スレ Part2
・Reactでチャット掲示板を作っていくスレ
・【統計分析】機械学習・データマイニング33
・5chみたいな掲示板を立てたい!
・BigQueryが非構造化データに対応。ユニケージ終焉へ
・C# vs Java どっちが好き? その3
・C#, C♯, C#相談室 Part96
・Rust vs Go
・【マウスだけで】Scratch【プログラミング】その1
・プログラム板へのID導入の投票実施中 月曜0:00まで
・プログラミングのお題スレ Part21
・intel xdk HTML5 アプリケーション 無償のエミュ
・C# vs Java どっちが好き? その5
・Androidプログラミング質問スレ revision53
・WPF(.NET, WinUI) GUIプログラミング Part26
・React と React Native のスレ
・C/C++の宿題片付けます 170代目
・【統計分析】機械学習・データマイニング27
・松尾豊さん以外に人工知能で有名な日本人研究者
01:19:33 up 4 days, 22:28, 1 user, load average: 116.27, 133.11, 129.86
in 3.6738839149475 sec
@[email protected] on 091714
|