<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	
	xmlns:georss="http://www.georss.org/georss"
	xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
	>

<channel>
	<title>GUI Archives - JIN&#039;s BOT</title>
	<atom:link href="https://jinsbot.com/tag/gui/feed/" rel="self" type="application/rss+xml" />
	<link>https://jinsbot.com/tag/gui/</link>
	<description>Coding + Engineering</description>
	<lastBuildDate>Sun, 22 Sep 2024 11:16:04 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.6.2</generator>
<site xmlns="com-wordpress:feed-additions:1">158124120</site>	<item>
		<title>chat GPT 하이브리드 앱 만들기 C# python</title>
		<link>https://jinsbot.com/chat-gpt-hybrid-python/</link>
					<comments>https://jinsbot.com/chat-gpt-hybrid-python/#respond</comments>
		
		<dc:creator><![CDATA[geniuskpj]]></dc:creator>
		<pubDate>Mon, 13 Mar 2023 09:55:39 +0000</pubDate>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[chat gpt]]></category>
		<category><![CDATA[GPT]]></category>
		<category><![CDATA[GUI]]></category>
		<category><![CDATA[PYTHON]]></category>
		<category><![CDATA[Turbo]]></category>
		<category><![CDATA[닷넷]]></category>
		<category><![CDATA[하이브리드]]></category>
		<guid isPermaLink="false">https://jinsbot.com/?p=885</guid>

					<description><![CDATA[<p>이전글에서 chat GPT python API 에 대해 설명했다. 한두번 사용하기엔 상관없지만 매번 python 파일을 수정하는 건 번거롭고 바람직하지 않다. 간단하게 터미널에서 입력을 받아도 되지만 자유도, 활용도를 높이기 위해 GUI 를 구축해보자. GUI 글에서 언급 했던 것처럼 웹앱을 만들어도 되지만 이번에는 데스크탑 앱을 만들어 보겠다. 그리고 보통 많이 사용되는 tkinter 나 PyQt 가 아니라 C# ( [&#8230;]</p>
<p>The post <a href="https://jinsbot.com/chat-gpt-hybrid-python/">chat GPT 하이브리드 앱 만들기 C# python</a> appeared first on <a href="https://jinsbot.com">JIN&#039;s BOT</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><a href="https://jinsbot.com/gpt3-5-turbo/" target="_blank" rel="noreferrer noopener">이전글</a>에서 chat GPT python API 에 대해 설명했다.</p>
<p>한두번 사용하기엔 상관없지만</p>
<p>매번 python 파일을 수정하는 건 번거롭고 바람직하지 않다.</p>
<p>간단하게 터미널에서 입력을 받아도 되지만</p>
<p>자유도, 활용도를 높이기 위해 GUI 를 구축해보자.</p>
<p><a href="https://jinsbot.com/gui-library-python/" target="_blank" rel="noreferrer noopener">GUI 글</a>에서 언급 했던 것처럼 웹앱을 만들어도 되지만</p>
<p>이번에는 데스크탑 앱을 만들어 보겠다.</p>
<p>그리고 보통 많이 사용되는 tkinter 나 PyQt 가 아니라</p>
<p>C# ( 닷넷 ) 을 활용해보자.</p>
<div class="wp-block-spacer" style="height: 10px;" aria-hidden="true"></div>
<h3 class="wp-block-heading">Python 으로 C#앱을 만든다고?</h3>
<p>pythonnet 패키지를 이용하면</p>
<p>파이썬 에서 C# 코드를 간단하게 사용할 수 있다.</p>
<p>하지만 Windows Forms 까지 사용해본 사람은 드물 것이다.</p>
<p>다음에 해당하는 사람에게 이 가이드를 추천한다.</p>
<ul>
<li>Visual Studio (닷넷) 를 써보았다.</li>
<li>C# 앱을 개발해봤다.</li>
<li>tkinter 보다 복잡한 레이아웃을 만들고 싶다.</li>
<li>바이너리 크기를 최소화 하고 싶다.</li>
</ul>
<p>이 방식은 기본적으로 닷넷 프레임워크를 사용하기때문에</p>
<p>바이너리 크기가 작은 장점이 있다.</p>
<p>기본적으로 간단한 UI는 CLI 환경에서</p>
<p>개발하는걸 추천한다.</p>
<p>만약 복잡한 UI를 개발할 거라면 <strong>Visual Studio</strong>로</p>
<p>UI 코드를 만든 후 포팅하길 바란다.</p>
<h2 class="wp-block-heading">Chat GPT 앱 코드</h2>
<p>설치 되어야 하는 필수 패키지는 다음과 같다.</p>
<ul>
<li>pythonnet</li>
</ul>
<p>c함수 사용을 위한 ctypes 는 표준 함수라</p>
<p>설치 안해도 되지만 pythonnet ( c# ) 은 별도로 설치해야한다.</p>
<p>UI를 정의하는코드와 실행 코드를 나누었다.</p>
<p>우선 UI 코드를 설명하겠다.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">#myform.py
import clr
clr.AddReference("System.Windows.Forms")
clr.AddReference('System.Drawing')
clr.AddReference('System')
from System.Windows.Forms import *
from System.Drawing import *

from concurrent.futures import ThreadPoolExecutor
import requests

# chatGPT
URL = "https://api.openai.com/v1/chat/completions"
headers = {"Authorization": "Bearer 발급받은API키",
           "Content-Type": "application/json"}


def task(form):
    if form.query != '':
        messages = [{"role": "system", "content": "You are a helpful assistant."}]
        if form.assist != '':
            messages.append({"role": "assistant", "content": form.assist})
            form.log.write(f'Assist:{form.assist}\n')
        messages.append({"role": "user", "content": form.query})
        Data = {"model": "gpt-3.5-turbo", "messages": messages, "temperature": form.temp,
                "max_tokens": form.max_token}
        res = requests.post(URL, headers=headers, json=Data)
        form.answer = res.json()['choices'][0]['message']['content']

        form.log.write('Q:' + form.query + "\n")
        form.log.write('A:')
        form.log.writelines(form.answer + "\n")
        form.log.write("\n")
        form.abox.Text = form.answer
        print('result arrived')
    else:
        MessagBox.Show("Query is empty")


class MyForm(Form):
    def __init__(self, temp, max_token, lq, la, log):
        self.log = log
        self.temp = temp
        self.max_token = max_token
        self.lq = lq
        self.la = la
        self.exe = ThreadPoolExecutor(max_workers=2)
        super().__init__()
        c_w = 1000
        c_h = 1000

        self.ClientSize = Size(c_w, c_h)

        self.pn = TableLayoutPanel()
        self.pn.RowCount = 3
        self.pn.ColumnCount = 1
        self.pn.ColumnStyles.Add(ColumnStyle(SizeType.Percent, 100.0))
        self.pn.RowStyles.Add(RowStyle(SizeType.Percent, 10.0))
        self.pn.RowStyles.Add(RowStyle(SizeType.Percent, 20.0))
        self.pn.RowStyles.Add(RowStyle(SizeType.Percent, 70.0))
        self.pn.Dock = DockStyle.Fill

        self.pn1 = TableLayoutPanel()
        self.pn1.RowCount = 2
        self.pn1.ColumnCount = 2
        self.pn1.ColumnStyles.Add(ColumnStyle(SizeType.Percent, 50.0))
        self.pn1.ColumnStyles.Add(ColumnStyle(SizeType.Percent, 50.0))
        self.pn1.RowStyles.Add(RowStyle(SizeType.Percent, 20.0))
        self.pn1.RowStyles.Add(RowStyle(SizeType.Percent, 80.0))
        self.pn1.Dock = DockStyle.Fill

        self.pn2 = TableLayoutPanel()
        self.pn2.RowCount = 2
        self.pn2.ColumnCount = 3
        b_width = 7.5
        self.pn2.ColumnStyles.Add(ColumnStyle(SizeType.Percent, b_width))
        self.pn2.ColumnStyles.Add(ColumnStyle(SizeType.Percent, 100 - 2 * b_width))
        self.pn2.ColumnStyles.Add(ColumnStyle(SizeType.Percent, b_width))
        self.pn2.RowStyles.Add(RowStyle(SizeType.Percent, 50.0))
        self.pn2.RowStyles.Add(RowStyle(SizeType.Percent, 50.0))
        self.pn2.Dock = DockStyle.Fill

        self.lbl = Label()
        self.lbl.Text = f'Temperature={temp}'
        self.lbl.TextAlign = ContentAlignment.MiddleCenter
        self.lbl.Dock = DockStyle.Fill
        self.lbl2 = Label()
        self.lbl2.Text = f'Max token={max_token}'
        self.lbl2.TextAlign = ContentAlignment.MiddleCenter
        self.lbl2.Dock = DockStyle.Fill
        self.trb = TrackBar()
        self.trb.Dock = DockStyle.Fill
        self.trb.Maximum = 20
        self.trb.Minimum = 0
        self.trb.TickFrequency = 1
        self.trb.LargeChange = 2
        self.trb.SmallChange = 1
        self.trb.Value = int(temp * 10)
        self.trb.Scroll += self.temp_moved
        self.trb2 = TrackBar()
        self.trb2.Dock = DockStyle.Fill
        self.trb2.Maximum = 1000
        self.trb2.Minimum = 0
        self.trb2.TickFrequency = 100
        self.trb2.LargeChange = 200
        self.trb2.SmallChange = 100
        self.trb2.Value = max_token
        self.trb2.Scroll += self.token_moved

        self.lbl3 = Label()
        self.lbl3.Text = 'Assitant:'
        self.lbl3.TextAlign = ContentAlignment.MiddleCenter
        self.lbl3.Dock = DockStyle.Fill
        self.txtbox = TextBox()
        self.txtbox.Dock = DockStyle.Fill
        self.txtbox.Multiline = True
        self.txtbox.Text = la

        self.lbl3_2 = Label()
        self.lbl3_2.Text = 'Query:'
        self.lbl3_2.TextAlign = ContentAlignment.MiddleCenter
        self.lbl3_2.Dock = DockStyle.Fill

        self.txtbox_2 = TextBox()
        self.txtbox_2.Dock = DockStyle.Fill
        self.txtbox_2.Multiline = True
        self.txtbox_2.Text = lq
        self.button1 = Button()
        self.button1.Text = "Clear"
        self.button1.ForeColor = Color.Black
        self.button1.Dock = DockStyle.Fill
        self.button1.Click += self.clear_clicked
        self.button2 = Button()
        self.button2.Text = "Send"
        self.button2.ForeColor = Color.Black
        self.button2.Dock = DockStyle.Fill
        self.button2.Click += self.send_clicked

        self.abox = TextBox()
        self.abox.Dock = DockStyle.Fill
        self.abox.Multiline = True
        self.Controls.Add(self.pn)
        self.pn1.Controls.Add(self.lbl, 0, 0)
        self.pn1.Controls.Add(self.lbl2, 1, 0)
        self.pn1.Controls.Add(self.trb, 0, 1)
        self.pn1.Controls.Add(self.trb2, 1, 1)

        self.pn2.Controls.Add(self.lbl3, 0, 0)
        self.pn2.Controls.Add(self.txtbox, 1, 0)
        self.pn2.Controls.Add(self.button1, 2, 0)
        self.pn2.Controls.Add(self.lbl3_2, 0, 1)
        self.pn2.Controls.Add(self.txtbox_2, 1, 1)
        self.pn2.Controls.Add(self.button2, 2, 1)

        self.pn.Controls.Add(self.pn1, 0, 0)
        self.pn.Controls.Add(self.pn2, 0, 1)
        self.pn.Controls.Add(self.abox, 0, 2)

    def run(self):
        Application.Run(self)

    def send_clicked(self, sender, args):
        self.assist = self.txtbox.Text
        self.query = self.txtbox_2.Text

        self.exe.submit(task, self)

    def clear_clicked(self, sender, args):
        self.txtbox.Clear()
        self.txtbox_2.Clear()
        print('Cleared')

    def temp_moved(self, sender, args):
        self.temp = self.trb.Value / 10.0
        self.lbl.Text = f'Temperature={self.temp}'

    def token_moved(self, sender, args):
        self.max_token = int(self.trb2.Value)
        self.lbl2.Text = f'Max Token={self.max_token}'
</pre>
<p>task 함수에서 쿼리 요청 및 수신을 처리하고</p>
<p>수신된 결과를 로그에 기록한다.</p>
<p>사용되는 메세지의 구조 는 <a href="https://jinsbot.com/gpt3-5-turbo/" target="_blank" rel="noreferrer noopener">이전글</a>을 참고하라.</p>
<p>ThreadpoolExecutor ( 멀티 스레드 ) 를 사용해</p>
<p>task 함수는 UI 와 별도 스레드에서 실행 된다.</p>
<p>Async 로도 짜보았지만 수신에 시간이 걸릴 경우</p>
<p>UI 스레드가 freeze 된다.</p>
<p>Qthread 처럼 System.Threading 의</p>
<p><a href="https://github.com/pythonnet/pythonnet/blob/master/demo/DynamicGrid.py" target="_blank" rel="noreferrer noopener">Thread</a>함수를 사용해도 된다.</p>
<p>init 함수에서 UI 요소를 설정하는 건</p>
<p>C# 과 동일하며 코드도 거의 일치 한다.</p>
<p>TableLayoutPanel 을 이용해 레이아웃을 만들었고</p>
<p>TrackBar , Label , Button , TextBox 를 사용했다.</p>
<p>각 함수의 초기화 코드 및 사용법은 인터넷에</p>
<p>잘 나오니 따로 설명하지 않겠다.</p>
<p>버튼, 트랙바에 사용되는 callback 함수도</p>
<p>코드에 나온대로 매우 간단하게 짤 수 있다.</p>
<p>실행 코드는 더욱 더 간단하다.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">#Only for python embed
import sys
sys.path.append('.')

import csv
from myform import MyForm

log=open('log.txt','a+')
try:
    f=open('cfg.csv','r')
    r=csv.DictReader(f,delimiter=';')
    cfg=dict(r.__next__())
    f.close()
    temp=float(cfg['Temperature'])
    max_token=int(cfg['MaxToken'])
    lq=cfg['LastQuery']
    la=cfg['LastAssist']
except:
    temp=0.1
    max_token=100
    lq=''
    la=''
a=MyForm(temp,max_token,lq,la,log)
a.run()
a.Dispose()
if hasattr(a,'query'):
    with open('cfg.csv','w') as f:
        wr=csv.DictWriter(f,fieldnames=["Temperature","MaxToken","LastQuery","LastAssist"],delimiter=';')
        wr.writeheader()
        wr.writerow({"Temperature":a.temp,"MaxToken":a.max_token,"LastQuery":a.query,"LastAssist":a.assist})
log.close()
print('')
</pre>
<p>path.append는 embeddable python 에만 필요하다.</p>
<p>그리고 필수적인 요소는 아니지만 참고를 위해</p>
<p>cfg.csv에 마지막으로 사용한 쿼리를 저장한다.</p>
<p>Assistant에 입력할 내용은 사전정보나</p>
<p>chat GPT 의 이전 답변이며 비워두어도 된다.</p>
<p>Query 에 질문을 적으면 된다.</p>
<p>로그 파일에 쿼리 들 과 답변을 기록한다.</p>
<div class="wp-block-spacer" style="height: 10px;" aria-hidden="true"></div>
<p>이정도면 chat GPT 의 GUI 하이브리드 앱</p>
<p>코드에 대한 충분한 설명이 되었으리라 본다.</p>
<p>이 앱 은 openai 에 로그인 하기 귀찮은 사람이나</p>
<p>차단된 곳에서 활용하기 유용할 것이다.</p>
<p>30분만에 대충 짠 코드이니 UI, 성능에 대한</p>
<p>최적화는 직접 해보길 바란다.</p>
<p>(23.08.17 update)</p>
<p>Textbox에서는 \n 대신 \r\n을 사용해야한다.</p>
<hr class="wp-block-separator has-alpha-channel-opacity is-style-wide" />
<p>이전글</p>
<ul>
<li><a href="https://jinsbot.com/gpt3-5-turbo/">GPT3.5 Turbo – ChatGPT python API 소개</a></li>
<li><a href="https://jinsbot.com/chatgpt-alternative/">chatGPT 한계점과 대체재에 대해</a></li>
<li><a href="https://jinsbot.com/gpt-3-5-python/">GPT-3.5 python에서 사용하기</a>( Temperature 에 대한 설명)</li>
<li><a href="https://jinsbot.com/gui-library-python/">GUI 라이브러리 소개 python</a></li>
<li><a href="https://jinsbot.com/gpt-4-introduction/">GPT-4 뭐가 달라 졌을까?</a></li>
<li><a href="https://jinsbot.com/%eb%b9%99-new-bing-intro/">빙 생성 AI 까지 넘보는 중</a></li>
</ul>
<p>The post <a href="https://jinsbot.com/chat-gpt-hybrid-python/">chat GPT 하이브리드 앱 만들기 C# python</a> appeared first on <a href="https://jinsbot.com">JIN&#039;s BOT</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://jinsbot.com/chat-gpt-hybrid-python/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">885</post-id>	</item>
		<item>
		<title>GUI 라이브러리 소개 python</title>
		<link>https://jinsbot.com/gui-library-python/</link>
					<comments>https://jinsbot.com/gui-library-python/#respond</comments>
		
		<dc:creator><![CDATA[geniuskpj]]></dc:creator>
		<pubDate>Mon, 06 Mar 2023 09:47:56 +0000</pubDate>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[bokeh]]></category>
		<category><![CDATA[dash]]></category>
		<category><![CDATA[GUI]]></category>
		<category><![CDATA[pyqt]]></category>
		<category><![CDATA[PYTHON]]></category>
		<category><![CDATA[Qt]]></category>
		<category><![CDATA[streamlit]]></category>
		<category><![CDATA[tkinter]]></category>
		<guid isPermaLink="false">https://jinsbot.com/?p=879</guid>

					<description><![CDATA[<p>Python 에서 사용가능한 GUI 라이브러리 들을 몇가지 소개하겠다. 순수 GUI 라이브러리 PyQt, PySide QT는 본래 C++ 환경에서 사용가능하게 만들어진 프레임워크이다. Qt Designer를 통해 Visual studio 처럼 GUI환경에서 UI를 만들 수 있는게 특징이다. 리눅스, 윈도우 등 크로스 플랫폼으로 사용할 수 있고 python, ruby 등의 언어와 붙일 수 있다는게 장점이다. 이중 python bindg인PyQt는 python에서 가장 대중적인 GUI [&#8230;]</p>
<p>The post <a href="https://jinsbot.com/gui-library-python/">GUI 라이브러리 소개 python</a> appeared first on <a href="https://jinsbot.com">JIN&#039;s BOT</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Python 에서 사용가능한 GUI 라이브러리 들을 몇가지 소개하겠다.</p>
<h3 class="wp-block-heading">순수 GUI 라이브러리</h3>
<ul>
<li>PyQt, PySide</li>
</ul>
<p>QT는 본래 C++ 환경에서 사용가능하게 만들어진 프레임워크이다.</p>
<p><strong>Qt Designer</strong>를 통해 Visual studio 처럼 GUI환경에서 UI를 만들 수 있는게 특징이다.</p>
<p>리눅스, 윈도우 등 크로스 플랫폼으로 사용할 수 있고</p>
<p>python, ruby 등의 언어와 붙일 수 있다는게 장점이다.</p>
<p>이중 python bindg인<strong>PyQt</strong>는 python에서</p>
<p>가장 대중적인 GUI 라이브러리 중 하나이다.</p>
<p>따라서 예제가 풍부하고 사용도 간편한 장점이 있지만</p>
<p>GPL 에 의해 배포시 소스코드를 공개해야하며 싫다면</p>
<p>상업용 라이센스를 구매,구독해야한다.</p>
<p>이에 반하여 Qt의 원저작자가 LGPL로 만든것이 <strong>PySide</strong>이다.</p>
<p>자세한 내용은 <a href="https://namu.wiki/w/Qt(%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC)#s-10.1" target="_blank" rel="noreferrer noopener">꺼무위키</a>를 참고하길 바란다.</p>
<p>그러므로 배포할 계획이 있다면 제약이 적은  <strong>PySide</strong>를 사용하는게 바람직하다.</p>
<p>참고로 두 라이브러리는 사용법이 거의 같지만 관리하는 주체가 다르다.</p>
<div class="wp-block-spacer" style="height: 10px;" aria-hidden="true"></div>
<ul>
<li>Tkinter</li>
</ul>
<p>Tkinter 는 PyQT 와 함께 가장 많이 사용되는</p>
<p>GUI 라이브러리 중 하나이다.</p>
<p>Python 표준 라이브러리 에 해당하기때문에</p>
<p>Windows에서는 Python 설치시 같이 설치된다.</p>
<p>리눅스와, 윈도우, 맥 에서 사용가능하며   QT에 비해 저용량, 저사양이다.</p>
<p>실행파일의 크기도 작고 실행속도도 빠르기때문에</p>
<p>간단한 python 앱을 만들 때 자주 사용된다.</p>
<p>그러나 CLI 환경에서 디자인 해야하고 투박하며 기본 tkinter 의 편의성이 떨어진다.</p>
<p>예를 들어 표의 기능을 사용하고 싶다면 tksheet이라는</p>
<p>애드온 라이브러리를 설치해야 한다.</p>
<div class="wp-block-spacer" style="height: 10px;" aria-hidden="true"></div>
<p>이외에도 wxPython, Kivy 등의 라이브러리가 많이 사용된다.</p>
<div class="wp-block-spacer" style="height: 10px;" aria-hidden="true"></div>
<h3 class="wp-block-heading">요즘 대세 = 웹앱</h3>
<p>최근에는 위와 같은 전통적인 GUI 라이브러리보다</p>
<p>대시보드 형태의 웹앱 라이브러리가 각광 받고 있다.</p>
<ul>
<li>Dash</li>
</ul>
<p>Dash는 flask, Plotly, React 등을 활용해 만들어진 GUI 라이브러리다.</p>
<p>잘 꾸밀 경우 상당히 유려하고 다양한 기능을 제공하며</p>
<p>SPA(Single Page Application) 라이브러리  중 가장 인지도가 높다.</p>
<p>그런 만큼 예제도 풍부하고 문서화도 잘 되어있다.</p>
<p>다만 Tkinter 처럼 CLI환경에서 디자인을 해야하고</p>
<p>HTML에 대한 지식이 약간 필요한게 단점이다.</p>
<p>또, 구성 요소가 많아질 경우 예쁘게 배치하는게 까다롭거나 번거롭다.</p>
<p>그래도 속도 하나만큼은 후술할 라이브러리에 비해서 빠르기때문에</p>
<p>대량의 데이터를 plot 하거나 Rendering 할 때 유리하다.</p>
<p>정적인 이미지 파일로도 export 가능하지만 Jupyterlab, 웹앱 등으로</p>
<p>interactive graph 를 그릴 때 가장 빛을 발한다.</p>
<div class="wp-block-spacer" style="height: 10px;" aria-hidden="true"></div>
<ul>
<li>Streamlit</li>
</ul>
<p>Dash와 비슷한 친구인데 사용법이 좀 더 간편하다.</p>
<p>사용자도 계속 늘어 Dashboard 계열 GUI 라이브러리 중</p>
<p>가장 관심받는 신성이다.</p>
<p>Dash보다 좀 더 간단한 그래프, 표를 나타나는데 적합하며</p>
<p>HTML에 대해 잘 몰라도 상관없다.</p>
<p>다만 설치 시 많은 의존성을 가지기 때문에 배포시 문제가 될 수 있다.</p>
<p>그리고 streamlit 앱 (streamlit.cli) 을 통해 실행되기때문에</p>
<p>이에 대한 설정, 디버깅이 번거롭다.</p>
<div class="wp-block-spacer" style="height: 10px;" aria-hidden="true"></div>
<ul>
<li>Bokeh</li>
</ul>
<p>Dash 와 유사한 라이브러리로 Panel, Dask 등을 이용해</p>
<p>다양한 기능을 제공한다.</p>
<p>기본 레이아웃들이 Dash에 비해 유려하지만</p>
<p>특색있고 예쁘게 customize 하기는 어렵다.</p>
<p>반면 Dash는 html 과 React 를 이용해 만들어졌기때문에</p>
<p>전문가가 붙으면 빠르고 쉽게 꾸밀 수 있다.</p>
<p>Bokeh는 Jupyterlab에 좀더 특화되었고 Dash는 웹앱에</p>
<p>좀 더 장점을 가진다.</p>
<p>수만개 이상의 데이터를 plot할 때는 Dash보다 상당히 느리다.</p>
<div class="wp-block-spacer" style="height: 10px;" aria-hidden="true"></div>
<p>현재의 github stars , 다운로드는 <a href="https://plotly.com/compare-dash-shiny-streamlit-bokeh/" target="_blank" rel="noreferrer noopener">링크</a>를 참고하라.</p>
<p>다음에는 Dash 를 이용한 GUI 구축에 대해 적겠다.</p>
<hr class="wp-block-separator has-alpha-channel-opacity is-style-wide" />
<p>python 관련글</p>
<ul>
<li><a href="https://jinsbot.com/%ec%a3%bc%ea%b0%80-%ec%98%88%ec%b8%a1-%eb%82%98%ec%8a%a4%eb%8b%a5/">30분만에 나스닥 기업 주가 예측</a></li>
<li><a href="https://jinsbot.com/gpt-3-5-python/">GPT-3.5 python에서 사용하기</a></li>
<li><a href="https://jinsbot.com/gpt3-5-turbo/">GPT3.5 Turbo – ChatGPT python API 소개</a></li>
<li><a href="https://jinsbot.com/chat-gpt-hybrid-python/">chat GPT 하이브리드 앱 만들기 C# python</a></li>
</ul>
<p>The post <a href="https://jinsbot.com/gui-library-python/">GUI 라이브러리 소개 python</a> appeared first on <a href="https://jinsbot.com">JIN&#039;s BOT</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://jinsbot.com/gui-library-python/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">879</post-id>	</item>
	</channel>
</rss>
