<div dir="ltr"><div><div>Hi David,</div><div>I'm not really sure about what you were trying to accomplish; if you were just doing it for fun or to understand about its capabilities, that's it: it's fun and interesting.</div></div><div><br></div><div>But if you were hoping to get Bard or GPT to be able to write valid PyQt (and even Python) code, the issues you're listing are well known, and they are one of the reasons for which ChatGPT has been banned from StackOverflow (besides the fact that many people tried to use AI to provide answers and get reputation without considering the consequences of those poorly pasted answers).</div><div><br></div><div>These current AI models are not able to write thoughtful code: they do not really know anything about python or PyQt; and by "know" I mean it in the *awareness* sense.</div><div>They are able, based on their "training" to write limited sequences of concepts within a specified language interface, but they lack many complex aspects required by programming, especially since they have been trained using large model data that rewards more longer content than *valid* content. It's <a href="https://ai.stackexchange.com/a/38663" target="_blank">known</a> that ChatGPT was trained using StackOverflow posts, but that means that it uses *all* posts, no matter the quality of their code.<br></div><div>Note that this is also valid for "natural" human languages to some extent: the main difference is that most training data was natural language, so there's a larger data pool (which theoretically makes it more accurate, at least for language rules, grammar, syntax, etc), but when going into the semantics, there are problems, inconsistencies, inaccuracies and unreliability.<br></div><div><br></div><div>Poorly put (but note that this is an *extreme* approximation), it "statistically" writes word by word, based on the previous context (what was asked and what was previously written by it) and followed on by what its training suggests it. There's little if none hierarchical and structured thinking, which is what real programming normally requires.<br></div><div>The more you go into niche and complex subjects, including context, correlation and code design, the more invalid the answer is.</div><div><br></div><div>The main purpose of these AIs is to provide well written answers, not *valid* ones.<br></div><div>It has a lot of knowledge, but it's not really capable of intelligently putting it together and *validate* it.</div><div>It's almost like asking an intern to go to the library and do research on a subject they know nothing about: they will probably get you lots of useful material, but they have not become experts in that subject, they probably correlated data inconclusively, and you'll need to check their research on your own anyway.</div><div><br></div><div>Interestingly enough, it's not too different from what I've seen in many Youtube tutorials, where their authors create content with little awareness and almost no experience of the tools they're using. They find some toolkit, play around with it for a few hours (days at best), do some superficial research on the web to get some tutorial-aimed code working, and then release a video with poorly written code (often with typos that are rarely checked or mentioned), which is full of bad practices and terrible suggestions, like using hardcoded geometries without layout managers, or accessing the UI from external threads.<br></div><div><br></div><div>In fact, as you already found out, the given code is incomplete to begin with.</div><div>But that's not the only issue.<br></div><div>While your prompt was respected, conceptually speaking the dialog should be a separate class on its own, eventually called by signals or events.</div><div>Monkey patching event handlers is also often discouraged, and keyPressEvent should have been explicitly overridden instead. An even better solution would be to use QShortcut instead (but the AI doesn't consider that at first, as it has no "creative" nor "mindful" consideration of what it's doing).</div><div>Also, as you mentioned too, there are issues with the new PyQt6 flags, but that's understandable: even us humans still struggle with them :-)<br></div><div><br></div><div>As impressive as this technology is, it's still not ready for these purposes, at least right now.<br></div><div>Under careful human scrutiny, it can be a quite useful tool (a friend of mine already uses it for some basic js automations and repeated basic code snippets), but there's not much more than that, yet.</div><div>We need to wait for *a lot* of further AI generations before that point, and, most importantly, further "layers" of concepts, context and awareness.<br><br></div><div>Note that by "a lot" I don't necessarily mean decades. It will probably happen within the next few years. Especially considering that the evolution of AI also means that it could improve itself on its own, and that also means a recursive and exponential improvement: it's already happening :-)<br><br></div><div>By the time Qt7 EOL will arrive, we might have reached the point at which we won't really need to care about Qt8...<br></div><div><br></div><div>Cheers,</div><div>MaurizioB<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Il giorno mer 3 mag 2023 alle ore 21:29 David Cortesi <<a href="mailto:davecortesi@gmail.com" target="_blank">davecortesi@gmail.com</a>> ha scritto:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>On further conversation with Bard about this code I got it to add the following, to make the search dialog visible:</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><pre><code role="text">        <span># Connect the shortcut</span>
        self.keyPressEvent = self.on_key_press

    <span><span>def</span> <span>on_key_press</span>(<span>self, event</span>):</span>
        <span>if</span> event.modifiers() & QtCore.Qt.ControlModifier <span>and</span> event.key() == QtCore.Qt.Key_F:
            self.search_replace_dialog.show()
            <span>return</span> <span>True</span>
        <span>else</span>:
            <span>return</span> <span>super</span>().keyPressEvent(event)

</code></pre></div></blockquote></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, May 3, 2023 at 12:15 PM David Cortesi <<a href="mailto:davecortesi@gmail.com" target="_blank">davecortesi@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>I got my invite to try Google Bard, and after asking it some general questions in other areas I tried its skill at writing PyQt code. Here is one question and its response. The first two lines of the prompt were suggested earlier when I was asking it about code prompts in general.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><div id="m_-2734299446312279961m_-6886597415517642085m_-6154398252510985139m_75926048233950254gmail-user-query-content-4"><h2><span style="font-weight:normal"><font size="2">python=3.10<br>qt=6.5
<br>Write a Python subclass of QPlainTextEdit that includes methods for <br>implementing search and replace</font></span></h2></div></div></blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><span><div></div></span><span><span></span></span><div><div><span id="m_-2734299446312279961m_-6886597415517642085m_-6154398252510985139m_75926048233950254gmail-message-content-idr_e586546f1919d835"><div><p>Sure, here is a Python subclass of QPlainTextEdit that includes methods for implementing search and replace:</p><span><div><div>Python</div><pre><code role="text"><span>import</span> sys
<span>from</span> PyQt6.QtWidgets <span>import</span> QPlainTextEdit

<span><span>class</span> <span>SearchReplacePlainTextEdit</span>(<span>QPlainTextEdit</span>):</span>
    <span><span>def</span> <span>__init__</span>(<span>self</span>):</span>
        <span>super</span>().__init__()

        <span># Create the search and replace dialog</span>
        self.search_replace_dialog = QDialog()
        self.search_replace_line_edit = QLineEdit()
        self.replace_line_edit = QLineEdit()
        self.case_sensitive_checkbox = QCheckBox(<span>"Case sensitive"</span>)
        self.whole_words_checkbox = QCheckBox(<span>"Whole words"</span>)
        self.search_button = QPushButton(<span>"Search"</span>)
        self.replace_button = QPushButton(<span>"Replace"</span>)
        self.replace_all_button = QPushButton(<span>"Replace all"</span>)

        <span># Layout the dialog</span>
        layout = QVBoxLayout()
        layout.addWidget(self.search_replace_line_edit)
        layout.addWidget(self.replace_line_edit)
        layout.addWidget(self.case_sensitive_checkbox)
        layout.addWidget(self.whole_words_checkbox)
        layout.addWidget(self.search_button)
        layout.addWidget(self.replace_button)
        layout.addWidget(self.replace_all_button)
        self.search_replace_dialog.setLayout(layout)

        <span># Connect the buttons</span>
        self.search_button.clicked.connect(self.on_search)
        self.replace_button.clicked.connect(self.on_replace)
        self.replace_all_button.clicked.connect(self.on_replace_all)

    <span><span>def</span> <span>on_search</span>(<span>self</span>):</span>
        <span># Get the search text</span>
        search_text = self.search_replace_line_edit.text()

        <span># Get the replace text</span>
        replace_text = self.replace_line_edit.text()

        <span># Set the search flags</span>
        search_flags = QTextDocument.FindFlag.NoHighlight
        <span>if</span> self.case_sensitive_checkbox.isChecked():
            search_flags |= QTextDocument.FindFlag.CaseSensitive
        <span>if</span> self.whole_words_checkbox.isChecked():
            search_flags |= QTextDocument.FindFlag.WholeWords

        <span># Find the text</span>
        self.find(search_text, search_flags)

    <span><span>def</span> <span>on_replace</span>(<span>self</span>):</span>
        <span># Get the search text</span>
        search_text = self.search_replace_line_edit.text()

        <span># Get the replace text</span>
        replace_text = self.replace_line_edit.text()

        <span># Replace the text</span>
        self.replace(search_text, replace_text)

    <span><span>def</span> <span>on_replace_all</span>(<span>self</span>):</span>
        <span># Get the search text</span>
        search_text = self.search_replace_line_edit.text()

        <span># Get the replace text</span>
        replace_text = self.replace_line_edit.text()

        <span># Replace all instances of the search text with the replace text</span>
        self.replaceAll(search_text, replace_text)

</code></pre><div><div> Use code with caution. <a href="https://bard.google.com/faq#coding" rel="noopener noreferrer" aria-label="Learn more (opens in a new window)" target="_blank">Learn more</a></div></div></div></span></div></span></div></div><span><div><div></div></div></span><p>This code creates a subclass of QPlainTextEdit that includes methods for implementing search and replace. The search and replace dialog has the following features:</p><ul><li>A search text box</li><li>A replace text box</li><li>A case sensitive checkbox</li><li>A whole words checkbox</li><li>A search button</li><li>A replace button</li><li>A replace all button</li></ul><p>When the user clicks the search button, the text in the search text box is searched for in the text editor. If the text is found, the cursor is moved to the found text. When the user clicks the replace button, the text in the replace text box is substituted for the found text. When the user clicks the replace all button, all instances of the search text are replaced with the replace text.</p><p>I hope this is what you are looking for. Let me know if you have any other questions.</p></div></blockquote><div>It looks good but when I run it only the edit widget is visible. Not sure how it messed up the layout so the buttons etc. do not show.</div><div><br></div><div>Still, Bard gives a decent starting point.<br></div><div> <br></div></div>
</blockquote></div>
</blockquote></div><br clear="all"><br><span>-- </span><br><div dir="ltr">È difficile avere una convinzione precisa quando si parla delle ragioni del cuore. - "Sostiene Pereira", Antonio Tabucchi<br><a href="http://www.jidesk.net" target="_blank">http://www.jidesk.net</a></div>